题意:
就是给你一个长度为n的数组,每个点有个个数,每次你可以拿连续3个4个5个,问你是否可以全部拿完。
思考:
这和以前做的增减序列差不多,就是给你一个数组,每次可以让一段区间减去1,问你最少多少次整个数组变成零,就是差分后贪心即可。
这道题呢加了个限制就是长度为3,4,5,刚开始我在想,是不是从前往后走,如果不够就从前面或者后面去拿,但是太复杂了,不好写,不好写的思路往往是错的。其实再仔细想想,对于说3 4 5的长度,其实就是任意长度,但是长度至少为3,所以从前往后遍历一遍,如果差分值是正的就加上,看看此时位置i+3的位置是否为负值,如果为负值就拿过来,如果拿过之后sum变成负的了,代表前面的有的数无法被取了,所以就false了,然后搞完之后看看最终的sum是否为0。
代码:
int T,n,m,k;
int va[N];
int vb[N];
signed main()
{
IOS;
cin>>T;
for(int cs=1;cs<=T;cs++)
{
cin>>n;
for(int i=0;i<=n+1;i++) va[i] = 0;
for(int i=1;i<=n;i++) cin>>va[i];
for(int i=1;i<=n+1;i++) vb[i] = va[i]-va[i-1];
int sum = 0,suc = 1;
if(vb[1]<0||vb[2]<0||vb[3]<0) suc = 0;
for(int i=1;i<=n+1;i++)
{
if(vb[i]>0) sum += vb[i];
int can = i+3;
if(can>n+1) continue;
if(vb[can]<0)
{
sum += vb[can];
vb[can] = 0;
}
if(sum<0) suc = 0;
}
if(sum!=0) suc = 0;
cout<<"Case #"<<cs<<": ";
if(suc) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
总结:
多多思考和总结呀。