闲谈:
最后一个星期还是不浪了,做一下模拟赛(还是有点小虚)
题目:
有一个人想买糖吃,有两家商店A,B,A商店中第i个糖果的愉悦度为Ai,B商店中第i个糖果的愉悦度为Bi
给出n,W,表示每个商店都有n个糖果且两个商店的每个糖果的价格都是W
求出最大的min(Sa,Sb)-D*W
其中Sa表示在A商店买的糖果的愉悦度之和,Sb表示在B商店中买的糖果的愉悦度之和,D表示总共在两家商店买的糖果数
题解:
直接乱搞,贪心想一想,每次取糖果肯定先从愉悦度大的取为优
那么我们只要在取糖果的时候,一旦有一个商店的愉悦度和比较大,则买另一个商店的糖果,因为这样就能增大min(Sa,Sb)
然后在过程中判断一下其他情况就行了
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; int a[110000],b[110000]; int main() { int n;LL W; scanf("%d%lld",&n,&W); for(int i=1;i<=n;i++) scanf("%d",&a[i]); reverse(a+1,a+n+1); for(int i=1;i<=n;i++) scanf("%d",&b[i]); reverse(b+1,b+n+1); LL ans=0,d1=0,d2=0,t1=0,t2=0; for(int i=1;i<=2*n;i++) { if(a[t1+1]<=W&&b[t2+1]<=W) break; if(d1==d2) { if(t1+1<=n&&a[t1+1]>b[t2+1]) d1+=a[++t1]; else if(t2+1<=n) d2+=b[++t2]; } else if(d1>d2) { if(t2+1<=n) d2+=b[++t2]; else { ans=max(ans,min(d1,d2)-W*(i-1)); break; } } else { if(t1+1<=n) d1+=a[++t1]; else { ans=max(ans,min(d1,d2)-W*(i-1)); break; } } ans=max(ans,min(d1,d2)-W*i); } printf("%lld\n",ans); return 0; }