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(比赛禁止)可以用)贪心策略倒是比较简单。
#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