题目链接;https://cn.vjudge.net/problem/Gym-101775J
转自:https://blog.csdn.net/weixin_30849591/article/details/96598737
题意:有n种扑克牌和他们的张数,每次可以选择3-5张连续的扑克牌打出。问可不可以将所有牌全部打出。
思路:差分。如果差分后b[i]是负数,则肯定有b[i]段以I-1为终点。若b[i]为正,则肯定有以b[i]段以I为起点。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,a[maxn],b[maxn];
int main()
{
int T,kase=0;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
a[++n]=0;
for(int i=1;i<=n;i++)
{
b[i]=a[i]-a[i-1];
}
long long sum=0;
for(int i=1;i<=n;i++)
{
if(b[i]>0)
sum+=b[i];
if(i+3<=n&&b[i+3]<0)
sum+=b[i+3];
if(sum<0)
break;
}
if(b[1]<0||b[2]<0)
sum=-1;
printf("Case #%d: %s\n",++kase,sum==0?"Yes":"No");
}
}