LeetCode-1029.两地调度

/** 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;
		
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值