5 4 6 2 8 4 1 5 7 9 2
4Hint[pre] For the sample input: + If WYJ doesn't move the cards pile, when the game starts the state of cards is: 4 6 2 8 4 1 5 7 9 2 WYJ can take the first three piles of cards, and during the process, the number of face-up cards is 4-1+6-5+2-7. Then he can't pay the the "penalty value" of the third pile, the game ends. WYJ will get 12 cards. + If WYJ move the first four piles of cards to the end, when the game starts the state of cards is: 4 4 6 2 8 2 1 5 7 9 WYJ can take all the five piles of cards, and during the process, the number of face-up cards is 4-2+4-1+6-5+2-7+8-9. Then he takes all cards, the game ends. WYJ will get 24 cards. It can be improved that the answer is 4. **huge input, please use fastIO.** [/pre]
题解:
本次比赛a的第二题。。一开始还以为做不出来,后来尝试了一下居然ac了
思路:
由于是可以挪动的,所以我们先扩展一下字符串,也就是将数组从0到n-1复制一遍到n到2*n-1,然后我们扫一遍这个长度为2*n-1的数组,ans初始为0,每次加上上面的数组和下面的数组的差,如果ans是一个负数,那么就开始计算当前的最长长度和最长的值,否则继续。。然后扫到最后都还符合条件还要特判一下,还有就是如果当前的i大于了n,如果ans小于了0可以直接退出,或者是当前选择长度已经达到了n也可以退出
代码:
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<string>
#include<stdio.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;
int a[2000005];
int b[2000005];
int main()
{
int i,j,n,ans,d,tag,maxx,len,num;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
a[n+i]=a[i];
}
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
b[n+i]=b[i];
}
ans=0;
maxx=0;
num=0;
len=0;
d=-1;
for(i=0;i<2*n;i++)
{
num+=a[i];
ans+=(a[i]-b[i]);
len++;
if(len>=n)
{
maxx=num;
d=i-len+1;
break;
}
if(ans<0)
{
if(num>maxx)
{
maxx=num;
d=i;
}
if(i>n)
break;
ans=0;
num=0;
len=0;
}
}
printf("%d\n",d);
}
return 0;
}