1029. Two City Scheduling 递归vs找规律

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. 1 <= costs.length <= 100
  2. It is guaranteed that costs.length is even.
  3. 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);
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值