链接:http://cogs.pro/cogs/problem/problem.php?pid=2235
题意:每天鸡翅数量都会增加,每天也会有人买一定数量鸡翅,求最多卖给几个人。
奥妙重重……
对每天的鸡翅数量分类讨论,如果够卖就卖上,不够卖就分析前些日子卖得最多的一个如果不卖是否够,够就退了那个,再卖这个。
为什么呢?证明如下:
如果够卖,可以发现剩下的数量更多,答案至少不会更坏;
如果不够卖,就需要退掉至少两天来卖,答案不会更好。
贪心策略得证。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 const int maxn=250005; 8 int x[maxn],y[maxn]; 9 priority_queue<int,vector<int>,less<int> >q; 10 int haha() 11 { 12 freopen("wing.in","r",stdin); 13 freopen("wing.out","w",stdout); 14 int n;scanf("%d",&n); 15 for(int i=1;i<=n;i++)scanf("%d",&x[i]); 16 for(int i=1;i<=n;i++)scanf("%d",&y[i]); 17 int ans=0;long long num=0; 18 for(int i=1;i<=n;i++) 19 { 20 num+=x[i]; 21 if(num>=y[i]) 22 { 23 num-=y[i]; 24 ans++; 25 q.push(y[i]); 26 } 27 else if(!q.empty()) 28 { 29 int k=q.top();q.pop(); 30 if(k-y[i]>=0) 31 { 32 num+=k-y[i]; 33 q.push(y[i]); 34 } 35 else q.push(k); 36 } 37 } 38 printf("%d ",ans); 39 } 40 int sb=haha(); 41 int main(){;}