返回在尽可能多吃汉堡包的条件下,n天下来至少需要吃牛肉汉堡包的数量。
2,[1,2],[2,1]
2
牛妹两天吃的汉堡包总量为2+3。牛妹选择第一天吃1个鸡肉1个牛肉,第二天吃2个鸡肉1个牛肉的。 可以证明,这样选择是最优的(共吃了5个汉堡,且每天吃的数量都不同)
struct P{
int s, a;
};
bool cmp(P p1, P p2){
return p1.s > p2.s;
}
class Solution {
public:
/**
*
* @param n int整型
* @param a int整型一维数组
* @param aLen int a数组长度
* @param b int整型一维数组
* @param bLen int b数组长度
* @return long长整型
*/
long long EatingHamburger(int n, int* a, int aLen, int* b, int bLen) {
long long sum = 0;
P p[n];
for(int i=0;i<n;i++)
p[i] = P{a[i]+b[i], a[i]};
sort(p, p+n, cmp);
priority_queue<int> q;
for(int i=p[0].s,j=0;i>=0;i--){
while(j<n && p[j].s>=i){
q.push(p[j].a);
j++;
}
if(!q.empty()){
sum += max(i-q.top(), 0);
q.pop();
}
}
return sum;
}
}; import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @return long长整型
*/
class HamDay implements Comparable{
int jirou;
int niurou;
int sum;
HamDay(int a,int b)
{
jirou=a;
niurou=b;
sum=a+b;
}
@Override
public int compareTo(Object o) {
HamDay h = (HamDay) o;
if(this.sum>h.sum)
{
return -1;
}
else if(this.sum<h.sum)
{
return 1;
}
else
{
if(this.jirou>h.jirou)
return -1;
else
return 1;
}
}
}
public long EatingHamburger (int n, int[] a, int[] b) {
// write code here
PriorityQueue<HamDay> pq = new PriorityQueue<>();
HashSet<Integer> set = new HashSet<>();
long count = 0;
for(int i=0;i<n;i++)
{
pq.add(new HamDay(a[i],b[i]));
}
while(pq.size()!=0)
{
HamDay temp = pq.remove();
if(!set.contains(temp.sum))
{
count+=temp.niurou;
set.add(temp.sum);
}
else
{
int num = temp.sum;
int niu = temp.niurou;
while(set.contains(num)&&num>0)
{
if(niu!=0)
{
niu--;
num--;
}
else
{
num--;
}
}
count+=niu;
set.add(num);
}
}
return count;
}
}