描述
牛妹爱吃汉堡包,她觉得鸡肉汉堡包比牛肉汉堡包好吃。牛妹参加了一个活动,每天商家会给牛妹发a[i]个鸡肉汉堡包,b[i]个牛肉汉堡包,持续n天。牛妹想吃尽可能多的汉堡,而每天吃的汉堡总个数都不相同,并且尽可能少吃牛肉汉堡包。
返回在尽可能多吃汉堡包的条件下,n天下来至少需要吃牛肉汉堡包的数量。
示例1
输入:
2,[1,2],[2,1]复制
返回值:
2复制
说明:
牛妹两天吃的汉堡包总量为2+3。牛妹选择第一天吃1个鸡肉1个牛肉,第二天吃2个鸡肉1个牛肉的。 可以证明,这样选择是最优的(共吃了5个汉堡,且每天吃的数量都不同)
备注:
1\leq n,a[i],b[i] \leq 10^51≤n,a[i],b[i]≤105
解题思路:
1、明确题意,吃的汉堡尽可能多,每天不能重复,尽量少吃牛肉汉堡;
2、吃的汉堡尽可能多:a[i]+b[i]是每天最多能吃的汉堡个数;
3、每天不能重复:使用泛型函数find可以找到第i天如果将汉堡全部吃完的话会不会有重复;
while (find(sum.begin(), sum.end(), tmp) != sum.end()) {
int index = find(sum.begin(), sum.end(), tmp) - sum.begin();
if (b[i] > b[index] && b[i] > 0) {
4、尽量少吃牛肉汉堡:如果有重复的话就从牛肉汉堡吃的最多的那天中减掉一个,同时刷新牛肉汉堡数组和汉堡总和;
5、需要注意,如果将重复天数中牛肉汉堡都减完了还是有重复的话,就需要从当天中减去鸡肉汉堡。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param a int整型vector
* @param b int整型vector
* @return long长整型
*/
long long EatingHamburger(int n, vector<int>& a, vector<int>& b) {
// write code here
vector<long long> sum(n , 0);
long long res = 0;
for (int i = 0; i < n; i++) {
long long tmp = a[i] + b[i];
while (find(sum.begin(), sum.end(), tmp) != sum.end()) { //循环判断直至tmp与已有数组没有重复
int index = find(sum.begin(), sum.end(), tmp) - sum.begin();
if (b[i] > b[index] && b[i] > 0) { // 重复数据中哪天吃的牛肉汉堡多久从哪天减1
b[i]--;
tmp--;
} else if (b[index] > 0){
b[index]--;
sum[index]--;
res--;
} else { // 若重复天中均没有牛肉汉堡了,那么需要从鸡肉汉堡中减1
a[i]--;
tmp--;
}
}
res += b[i];
sum[i] = tmp;
}
return res;
}
};

京公网安备 11010502036488号