题目内容
咕咕东考试周开始了,考试周一共有n天。他不想考试周这么累,于是打算每天都吃顿好的。他决定每天都吃生煎,咕咕东每天需要买 a i 个生煎。但是生煎店为了刺激消费,只有两种购买方式:①在某一天一次性买两个生煎。②今天买一个生煎,同时为明天买一个生煎,店家会给一个券,第二天用券来拿。没有其余的购买方式,这两种购买方式可以用无数次,但是咕咕东是个节俭的好孩子,他训练结束就走了,不允许训练结束时手里有券。咕咕东非常有钱,你不需要担心咕咕东没钱,但是咕咕东太笨了,他想问你他能否在考试周每天都能恰好买 a i 个生煎。
输入格式
输入两行,第一行输入一个正整数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
解题思路
首先,咕咕东竟然最多要考273天,难怪一天最多吃一万个生煎。
生煎店老板:现世财神啊!
咳咳。
由于不能剩下券,所以对于每一天来说,如果前一天有券就必须要用,不然就会因为第二天过期花不出去。
对于某一天,只会有两个情况:
- 这一天要吃奇数个生煎
- 这一天要吃偶数个生煎
对于奇数个生煎的日子,如果手上有券,那么就消耗这张券,然后今天正好可以不买券吃个饱。如果手上没有券,那么今天下来就得买一张券了,给明天用。
对于偶数个生煎的日子,如果手上有券,那么就消耗这张券,并且买一张券给明天用,如果手上没券,就可以直接吃个饱了。
于是有代码:
#include<iostream>
#include<string>
using namespace std;
int day[100000+1];
int n;
bool isable;
bool isOdd(int x)//是否为奇数
{
if(x%2==0) return false;
else return true;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>day[i];
}
isable=false;
int ticket=0;
for(int d=0;d<n;d++)
{
if(isOdd(day[d]))//奇数个生煎
{
if(d==n-1)//最后一天
{
if(ticket==0) isable=false;
if(ticket==1) isable=true;
}
else
{
if(ticket==0)
{
ticket=1;
continue;
}
if(ticket==1)
{
ticket=0;
continue;
}
}
}
else//偶数个生煎
{
if(d==n-1)
{
if(ticket==0) isable=true;
if(ticket==1) isable=false;
}
else
{
if(ticket==0)
{
ticket=0;
continue;
}
if(ticket==1)
{
if(day[d]==0)
{
isable=false;
break;
}
else
{
ticket=1;
continue;
}
}
}
}
}
if(isable) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}