Competition2:咕咕东想吃饭

题目内容
咕咕东考试周开始了,考试周一共有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;
}
发布了21 篇原创文章 · 获赞 3 · 访问量 412

猜你喜欢

转载自blog.csdn.net/qq_44506233/article/details/104981923