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

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

2020牛客暑期多校训练营(第八场)——Kabaleo Lite_第1张图片

样例输入

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
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

 

你可能感兴趣的:(2020牛客暑期多校训练营(第八场)——Kabaleo Lite)