力扣 : 1029. 两地调度 (贪心)

1029. 两地调度 - 力扣(LeetCode)

思路:

先按最小的花费分组,

A组:[a1,b1] [a2,b2]      (A组全是a < b)

B组:[a3,b3] [a4,b4] [a5,b5] [a6,b6]    (B组全是b <= a)

现在人数不均,要各n个人,所以让B组1个去A组      让谁去呢?

现在去A组的花费 suma = a1+a2               去B组花费 sumb = b3+b4+b5+b6

因为B组 b<=a   ,   要想使答案最小(ans = suma + sumb) ,

B无论谁去都要多花一点  ,那就让花最少的去(也就是差值最小)

写代码可以直接记录差值,哪个人多了,就从小到大排序,使人数平衡

ans直接加上最小花费 , 换组时加上差值。

(ans = suma+sumb , 换组:sumb - bi   suma + ai  ,ans = sumb+suma+(ai-bi)  ,即改变差值即可)

code:

class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& nums) {
        //先将花费根据去哪个更便宜就去哪个   
        //分为 a b
        //如果都是一半的人    直接返回答案
        //如果不是    把多出一半人的组,换到另一组(差值更小的)

        int n=nums.size();

        //直接保存差值
        vector<int> suba,subb;
        int ans=0;
        for(int i=0;i<n;i++)
        {
            if(nums[i][0] < nums[i][1])
            {
                ans+=nums[i][0];
                suba.push_back(nums[i][1]-nums[i][0]);
            }
            else
            {
                ans+=nums[i][1];
                subb.push_back(nums[i][0]-nums[i][1]);
            }
        }

        if(suba.size()==subb.size())return ans;
        else if(suba.size() > subb.size())
        {
            sort(suba.begin(),suba.end());
            for(int i=0;i<suba.size()-n/2;i++)
            {
                ans+=suba[i];
            }
        }
        else
        {
            sort(subb.begin(),subb.end());
            for(int i=0;i<subb.size()-n/2;i++)
            {
                ans+=subb[i];
            }
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值