|
|
package class35;
|
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
|
// 来自小红书
|
|
|
// [0,4,7] : 0表示这里石头没有颜色,如果变红代价是4,如果变蓝代价是7
|
|
|
// [1,X,X] : 1表示这里石头已经是红,而且不能改颜色,所以后两个数X无意义
|
|
|
// [2,X,X] : 2表示这里石头已经是蓝,而且不能改颜色,所以后两个数X无意义
|
|
|
// 颜色只可能是0、1、2,代价一定>=0
|
|
|
// 给你一批这样的小数组,要求最后必须所有石头都有颜色,且红色和蓝色一样多,返回最小代价
|
|
|
// 如果怎么都无法做到所有石头都有颜色、且红色和蓝色一样多,返回-1
|
|
|
public class Code02_MagicStone {
|
|
|
|
|
|
public static int minCost(int[][] stones) {
|
|
|
int n = stones.length;
|
|
|
if ((n & 1) != 0) {
|
|
|
return -1;
|
|
|
}
|
|
|
Arrays.sort(stones, (a, b) -> a[0] == 0 && b[0] == 0 ? (b[1] - b[2] - a[1] + a[2]) : (a[0] - b[0]));
|
|
|
int zero = 0;
|
|
|
int red = 0;
|
|
|
int blue = 0;
|
|
|
int cost = 0;
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
if (stones[i][0] == 0) {
|
|
|
zero++;
|
|
|
cost += stones[i][1];
|
|
|
} else if (stones[i][0] == 1) {
|
|
|
red++;
|
|
|
} else {
|
|
|
blue++;
|
|
|
}
|
|
|
}
|
|
|
if (red > (n >> 1) || blue > (n >> 1)) {
|
|
|
return -1;
|
|
|
}
|
|
|
blue = zero - ((n >> 1) - red);
|
|
|
for (int i = 0; i < blue; i++) {
|
|
|
cost += stones[i][2] - stones[i][1];
|
|
|
}
|
|
|
return cost;
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
int[][] stones = { { 1, 5, 3 }, { 2, 7, 9 }, { 0, 6, 4 }, { 0, 7, 9 }, { 0, 2, 1 }, { 0, 5, 9 } };
|
|
|
System.out.println(minCost(stones));
|
|
|
}
|
|
|
|
|
|
}
|