闲谈:

  最后一个星期还是不浪了,做一下模拟赛(还是有点小虚)


#30.candy

题目:

  有一个人想买糖吃,有两家商店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;
}
#30

相关文章:

  • 2021-09-19
  • 2021-10-28
  • 2021-04-25
  • 2021-09-21
  • 2021-06-16
猜你喜欢
  • 2021-05-24
  • 2021-05-24
  • 2021-04-06
  • 2021-10-25
  • 2021-04-22
  • 2021-12-21
  • 2021-06-11
相关资源
相似解决方案