2020牛客暑期多校训练营(第八场)——Kabaleo Lite

2020牛客暑期多校训练营(第八场)——Kabaleo Lite

样例输入

2
3
2 -1 3
3 2 1
4
3 -2 3 -1
4 2 1 2

样例输出

Case #1: 3 8
Case #2: 4 13

说明

For test case 1, the maximum number of visitors is 3, one of a possible solution is:
The first visitor received food 1, the profit is 2.
The second visitor received food 1, the profit is 2.
The third visitor received food 1 + food 2 + food 3, the profit is 2 + (-1) + 3.

题目大意

厌倦了无聊的WFH,阿波罗决定开设一家名为Kabaleo Lite的快餐店。

该餐厅提供n种食物,编号从 1 到 n 。第i种食物的利润是 ai 。利润可能为负,因为它使用了昂贵的原料。第一天,阿波罗用第 i 种食材做了 bi 道菜。

阿波罗餐厅的独特之处在于订购食物的过程。阿波罗亲自为每个访客选择了一组该访客将获得的菜肴。这样做时,阿波罗遵循以下规则:

  • 每个访客应至少获得一道菜。

  • 每个访客都得到从第1种开始的连续种类编号的菜,而且每道菜只能有一碟

阿波罗最多可容纳多少访客?而且他想知道最大的访问者可以赚取的最大利润

输入描述:

输入的第一行给出测试用例的数量T(1≤T≤10)。 随后是T组测试用例。

每个测试用例均以包含一个整数n(1≤n≤10^5)的一行开头,代表不同种类的食物的数量。

第二行包含n个以空格分隔的数字ai(-10^9≤ai≤10^9),其中ai表示第i类一道菜的收益。

第三行包含n个以空格分隔的数字bi(1≤bi≤10^5),其中bi表示第i种菜肴的数量。

输出描述:

对于每个测试用例,以形式输出一行,其中x是测试用例编号(从1开始),y是最大的访问者数量,z是最大的可能利润。

题解

本题数据报long long(一群人WA了十几遍,无fuck说),利润最大值可能达到1e19。所以用高精度。(后来听说long double,__int128(比赛禁止)可以用)贪心策略倒是比较简单。

AC Code

#include<bits/stdc++.h>
using namespace std;
const long long N=1e5+9,mod=1e14;
long long a[N],b[N],s[N],n,m,ans;
int main()
{
    int T,t,l,r,i,j,k;
    scanf("%d",&T);
    for(k=1;k<=T;k++)
    {
        memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(s,0,sizeof(s));
        scanf("%lld",&n);
        for(i=0;i<n;i++) scanf("%lld",&a[i]);
        scanf("%lld",&b[0]);
        for(i=1;i<n;i++) scanf("%lld",&b[i]),b[i]=min(b[i],b[i-1]);
        s[0]=a[0];
        for(i=1;i<n;i++) s[i]=s[i-1]+a[i];
        l=r=t=ans=0,m=s[l]*b[l];
        while(r<n)
        {
            while(r<n && s[r]<=s[l]) r++;
            if(r==n)break;
            m+=b[r]*(s[r]-s[l]),ans+=m/mod,m%=mod;
            l=r,t=0;
        }
        printf("Case #%d: %lld ",k,b[0]);
        if(ans) printf("%lld%014lld\n",ans,m);
        else printf("%lld\n",m);
    }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值