2N명이 있다고 가정합니다. 회사에서 하나의 인터뷰를 조직하려고 합니다. i번째 사람을 도시 A로 보내는 데 드는 비용은 비용[i][0]이고 i번째 사람을 도시 B로 보내는 데 드는 비용은 비용[i][1]입니다. N명이 모든 도시에 도착할 수 있도록 모든 사람을 도시로 보내는 데 드는 최소 비용을 찾아야 합니다. 따라서 주어진 목록이 [[10, 20], [30, 200], [400, 50], [30, 20]]이면 출력은 110이 됩니다. 따라서 사람 P1을 비용 10으로 도시 A로 보냅니다. , 두 번째 사람은 비용 30으로 도시 A에, 세 번째 및 네 번째 사람은 도시 B에 비용 50 및 20으로 각각 이동합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- n :=배열의 크기
- a :=n / 2 및 b :=n / 2
- 배열을 정렬하고 ans :=0으로 둡니다.
- i에 대해 :=0 ~ n – 1 −
- b =0이고 array[i, 0] <=array[i, 1]이고 a> 0이면
- 1씩 감소
- ans :=ans + 배열[i, 0]
- 기타
- b를 1 감소
- ans :=ans + 배열[i, 1]
- b =0이고 array[i, 0] <=array[i, 1]이고 a> 0이면
- 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(vector <int> a, vector <int> b){
return abs(a[0] - a[1]) > abs(b[0] - b[1]);
}
int twoCitySchedCost(vector<vector<int>>& costs) {
int n = costs.size();
int a = n/2;
int b = n/2;
sort(costs.begin(), costs.end(), cmp);
int ans = 0;
for(int i = 0; i < n; i++){
if(b == 0 || (costs[i][0] <= costs[i][1] && a > 0)){
a--;
//cout << a << " " << costs[i][0] << endl;
ans += costs[i][0];
} else {
//cout << costs[i][1] << endl;
b--;
ans += costs[i][1];
}
}
return ans;
}
};
main(){
Solution ob;
vector<vector<int>> c = {{10,20},{30,200},{400,50},{30,20}};
cout << ob.twoCitySchedCost(c);
} 입력
[[10,20],[30,200],[400,50],[30,20]]
출력
110