There are 2N
people a company is planning to interview. The cost of flying the i
-th person to city A
is costs[i][0]
, and the cost of flying the i
-th person to city B
is costs[i][1]
.
Return the minimum cost to fly every person to a city such that exactly N
people arrive in each city.
Example 1:
Input: [[10,20],[30,200],[400,50],[30,20]] Output: 110 Explanation: The first person goes to city A for a cost of 10. The second person goes to city A for a cost of 30. The third person goes to city B for a cost of 50. The fourth person goes to city B for a cost of 20. The total minimum cost is 10 + 30 + 50 + 20 = 110 to have half the people interviewing in each city.
Note:
1 <= costs.length <= 100
- It is guaranteed that
costs.length
is even. 1 <= costs[i][0], costs[i][1] <= 1000
这个题目拿到手一看觉得挺难啊,但是分明是easy基本,开始想递归,果然数据量一大时间就超时,看别人答案,原来,还可以这么思考。
For eg. [[10,20],[30,200],[400,50],[30,20]]
pair ~~~~~~~~~ difference~~~~~~~~~ logic
[10,20]~~~~~~~ -10~~~~~~~~~~~~~ go city A save 10 rupees
[30,200]~~~~~~ -170~~~~~~~~~~~~~ go city A save 170 rupees
[400,50]~~~~~~ +350~~~~~~~~~~~~~ go city B save 350 rupees
[30,20]~~~~~~ ~ +10~~~~~~~~~~~~~ go city B save 10 rupees
So , 按照difference排序,前一半选去A,因为这个时候去A省钱,后一般去B,因为那个时候去A费钱。
class Solution {
public:
int twoCitySchedCost(vector<vector<int>>& costs) {
for(int i = 0; i < costs.size(); i++)
{
int diff = costs[i][0] - costs[i][1];
costs[i].insert(costs[i].begin(), diff);
}
std::sort(costs.begin(), costs.end());
int res = 0;
int N = costs.size() / 2;
for(int i = 0; i < N; i++)
{
res = res + costs[i][1] + costs[i + N][2];
}
return res;
}
运行结果
Runtime: 12 ms, faster than 22.18% of C++ online submissions for Two City Scheduling.
Memory Usage: 8.1 MB, less than 100.00% of C++ online submissions forTwo City Scheduling.
顺便附上自己的超时递归,算是记录一下思路。
class Solution {
public:
int twoCitySchedCost(vector<vector<int>>& costs) {
int minCost = INT_MAX;
int currentCost = 0;
int cityA = 0;
int cityB = 0;
int N = costs.size() / 2;
findMin(costs, N, 0, cityA, cityB, currentCost, minCost);
return minCost;
}
void findMin(vector<vector<int>>& costs, int cityNum, int index, int cityA, int cityB, int currentCost, int& minCost)
{
if(index == 2*cityNum)
{
if(cityA == cityB)
{
if(currentCost < minCost)
minCost = currentCost;
}
return;
}
cityA++;
currentCost = currentCost + costs[index][0];
findMin(costs,cityNum, index + 1, cityA, cityB, currentCost, minCost);
cityA--;
cityB++;
currentCost = currentCost - costs[index][0];
currentCost = currentCost + costs[index][1];
findMin(costs, cityNum, index + 1, cityA, cityB, currentCost, minCost);
}
};