题目描述
咕咕东考试周开始了,考试周一共有n天。他不想考试周这么累,于是打算每天都吃顿好的。他决定每天都吃生煎,咕咕东每天需要买ai个生煎。但是生煎店为了刺激消费,只有两种购买方式:①在某一天一次性买两个生煎。 ②今天买一个生煎,同时为明天买一个生煎, 店家会给一个券,第二天用券来拿。没有其余的购买方式,这两种购买方式可以用无数次,但是咕咕东是个节俭的好孩子,他考试结束就走了,不允许考试结束时手里有券。咕咕东非常有钱,你不要担心咕咕东没钱,但是咕咕东太笨了,他想问你他能否在考试周每天都能恰好买ai个生煎。
Input
输入两行,第一行输入一个正整数n(1 <= n <= 10000),示考试周的天数。
第二行有n个数,第i个数a; (0<= ai <= 10000)示第i天咕咕陈要买的生煎的数量。
Output
如果可以满足咕咕东奇怪的要求,输出"YES", 如果不能满足,输出"NO"。(输出不带引号 )
样例
Input
4
2 1 2 1 2
Output
YES
Input
3
1 0 1
Output
NO
思路分析
创建一个结构体类point存放每天要买的生煎数和当天积累的券,我们现在考虑第i天,第i天要买的生煎数等于要吃的生煎数-前一天积累的券,若等于0,则当天不用买了也没有积累券;若等于偶数,则使用数次方案1的购买方案并且也没有积累券;若等于奇数,则使用数次方案1加一次方案2的购买方案,积累一张券。第i+1天重复上述操作。
这里有某室友提问,不能第i天用两个方案2买两生煎,第二天用两张券吗?
可以,但没必要。因为这样和两天都用方案1买是一样的,不去考虑让程序复杂的操作。
几个“NO”的情况:
1. 要买的生煎数小于0了,券多了,不是恰好。
2. 最后一天积累的券大于零。
AC代码
#include<iostream>
using namespace std;
struct point
{
int a;//要买的生煎数
int b;//当天积累的券
point(){}
point(int x,int y)
{
a=x;b=y;
}
};
int main()
{
int n;
cin>>n;
int num[n];
for(int i=0;i<n;i++)
{
cin>>num[i];
}
point before(0,0);
for(int i=0;i<n;i++)
{
point now;//当天
now.a=num[i] - before.b;//用掉前一天的券
now.b=0;
if(now.a==0)//当天不用买了 ,第二天没有券
{
before.b=0;
continue;
}
if(now.a<0)//买多了,不恰好
{
cout<<"NO";
return 0;
}
if(now.a%2==0)//偶数,方案1,第二天没有券
{
before.b=0;
}
else //奇数 ,方案1+2,第二天有一张券
{
before.b=1;
}
}
if(before.b>0)
{
cout<<"NO";
}
else
{
cout<<"YES";
}
return 0;
}