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;
}
};