提目描述:
咕咕东打算在为期n天的考试周每天吃生煎,他第i天需要买ai个生煎。生煎店为了刺激消费,提供了两种购买方式:1、一次性买两个生煎。2、今天买一个生煎,同时为明天买一个生煎,店家会给一个券,第二天拿券来拿。而且不提供其他的购买方式。两种购买方式可使用无数次。考试周结束时,咕咕东不希望有多余的券且不浪费任一张券,问能否每天买ai个生煎。
输入格式:
输入两行,第一行一个正整数n(1<=n<=100000),表示考试周天数。
第二行有n个数,第i个数ai(0<=ai<=10000)表示第i天要买的生煎数量。
输出格式:
如果可以满足要求,输出"YES",否则,输出"NO"(输出不带引号)。
样例输入1:
4
1 2 1 2
样例输出1:
YES
样例输入2:
3
1 0 1
样例输出2:
NO
思路:
n天内第i天要买ai个生煎,则建立一个n+1的数组来模拟购买的过程,如果第i天要购买的生煎数量为奇数且前一天没有剩余则将后一天的模拟值先+1后直接进入下一天;有剩余则直接进入下一天;如果为偶数且前一天没有剩余则直接进入下一天;有剩余则使用一次第一种方案将后一天的模拟值+1后进入下一天。最后模拟完成后检查第n+1天有没有剩余的卷即模拟值是否>0即可。
代码:
#include <iostream>
using namespace std;
int main()
{
int n=0,flag=0;
cin>>n;
int *temp=new int[n];
int *t2=new int[n+1];
for(int i=0;i<n;i++)
{
cin>>temp[i];
t2[i]=0;
}
t2[n]=0;
for(int i=0;i<n;i++)
{
if(temp[i]%2==1&&t2[i]==0)
{
t2[i]=temp[i];
t2[i+1]+=1;
}
if(temp[i]%2==1&&t2[i]==1)
{
t2[i]=temp[i];
}
if(temp[i]%2==0&&t2[i]==0&&temp[i]>0)
{
t2[i]=temp[i];
}
if(temp[i]%2==0&&t2[i]==1&&temp[i]>0)
{
t2[i+1]+=1;
t2[i]=temp[i];
}
if(temp[i]==0&&t2[i]!=0)
{
t2[i]=-1;
break;
}
}
if(t2[n]==0)
{
flag=0;
for(int i=0;i<n;i++)
{
if(temp[i]!=t2[i])
{
flag=-1;
break;
}
}
}
else
flag=-1;
if(flag==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}