/** 1029.两地调度
* @author 作者 Your-Name:
* @version 创建时间:2020年2月22日 下午9:06:20
* 公司计划面试 2N 人。第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]。
返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达。
示例:
输入:[[10,20],[30,200],[400,50],[30,20]]
输出:110
解释:
第一个人去 A 市,费用为 10。
第二个人去 A 市,费用为 30。
第三个人去 B 市,费用为 50。
第四个人去 B 市,费用为 20。
最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。
提示:
1 <= costs.length <= 100
costs.length 为偶数
1 <= costs[i][0], costs[i][1] <= 1000
*/
public class liangdidiaodu {
public static void main(String[] args)
{
int[][] costs = {{10,20},{30,200},{400,50},{30,20}};
System.out.print(twoCitySchedCost(costs));
}
public static int twoCitySchedCost(int[][] costs) {
int[] atb = new int[costs.length];
int[] bta = new int[costs.length];
int sum=0;
int a=0,b=0,balance=0;
for(int i=0;i<costs.length;i++)
{
if(costs[i][0]>costs[i][1])
{
sum+=costs[i][1];
bta[b++] = costs[i][0]-costs[i][1];
}
else if(costs[i][0]<costs[i][1])
{
sum+=costs[i][0];
atb[a++] = costs[i][1]-costs[i][0];
}
else
{
sum+=costs[i][0];
balance++;
}
}
Arrays.sort(atb);
Arrays.sort(bta);
int num = (Math.abs(a-b)-balance)/2;
System.out.println(a+" "+num+" "+b+" "+sum);
if(num<=0)
return sum;
else
{
int i = atb.length-a;
int j = bta.length-b;
for(int k=0;k<num;k++)
{
if(a<b)
{
sum+=bta[j++];
}
else
{
sum+=atb[i++];
}
}
}
return sum;
}
}