【題目】1029. 兩地調度
公司計劃面試 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
【解題思路1】
先假設全部去B市,再從中選擇N人轉去A市,那麼這N個人的多花了price_A - price_B 的費用(可正可負)
因此最優的方案是,選出 price_A - price_B 最小的 N 個人,讓他們飛去A 市,剩下的去 B 市
- 按照 price_A - price_B 從小到大排序;
- 將前 N 個人飛往 A 市,其餘人飛往 B 市,並計算出總費用。
class Solution {
public int twoCitySchedCost(int[][] costs) {
// 按price_A - price_B從小到大排序
Arrays.sort(costs, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o1[1] - (o2[0] - o2[1]);
}
});
int total = 0;
int n = costs.length / 2;
for (int i = 0; i < n; ++i)
total += costs[i][0] + costs[i + n][1];
return total;
}
}