Watermelon
思路:
先考虑都有一个人吃掉若干个西瓜,所以考虑每个人每次吃西瓜的范围就好了
p1表示最少吃的西瓜,可以保证经过的人数最多;
p2表示最多吃的西瓜,可以保证经过的人最少;
p1,p2的初始值均为m。
考虑三种情况即可:
(1)p1>0&&p2>0未见分晓
(2)p1>0,
考虑两种情况,如果在最大值,就是可以坑掉最大位置,是YES;
否则就接着判断。
(3)p1<0(此时p2<0一定成立),
考虑两种情况,如果在最大值,就是情况(2),直接YES;
否则就结束了,不能坑到最大值的位置,输出NO。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 3e6+10;
int a[maxn];
int main(void)
{
int T,n,m,i,j;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int pos,mx;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i==1) pos = i,mx = a[i];
else if(a[i]>mx){
pos = i;mx = a[i];
}
}
int p1 = m,p2 = m;
for(i=1;;i++){
if(i>n) i-=n;
if(p1<=0&&i!=pos){
printf("NO\n");break;
}
if(p2<=0&&i==pos){
printf("YES\n");break;
}
p1 = p1 - (i==pos?a[pos]:1);
p2 = p2 - a[i];
}
}
return 0;
}