题意:纸牌顺子:连续的3张或连续的4张或连续的5张为顺子。手中的牌共有n个数字,每个数字是a[i]个,能不能把手中所有的牌都是属于顺子。
[L,R]是一个顺子,就令b[L]+1,b[R+1]-1。a[i]就等于b[1]+b[2]+....+b[i],所以b[i]=a[i]-a[i-1];
如果这个b数组对于每个相邻距离大于等于3的b[i] 和 b[j] (j>=i+3),如果每一对的和加起来等于0,则给定的数列是可以得到的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int a[maxn];
int b[maxn];
int main()
{
int t,n;
scanf("%d",&t);
int r=1;
while(t--)
{
a[0]=0;
b[0]=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
b[i]=a[i]-a[i-1];
b[n+1]=-a[n];
printf("Case #%d: ",r++);
if(b[2]<0||b[3]<0)
{
printf("No\n");
continue;
}
int sum=0;
for(int i=1;i<=n+1;i++)
{
if(b[i]>0) sum+=b[i];
int p=i+3;
if(p>n+1) break;
if(b[p]<0)
{
sum+=b[p];
b[p]=0;
}
if(sum<0) break;
}
if(sum==0)printf("Yes\n");
else printf("No\n");
}
}