小明想吃饭

问题描述

小明考试周开始了,考试周一共有 n n 天。小明决定考试周每天都吃生煎,小明每天需要买 a i a_{i} 个生煎。但是生煎店为了刺激消费,只有两种购买方式:①在某一天一次性买两个生煎。②今天买一个生煎,同时为明天买一个生煎,店家会给一个券,第二天用券来拿。没有其余的购买方式,这两种购买方式可以用无数次,但是小明是个节俭的好孩子,他考试结束就走了,不允许考试结束时手里有券。小明遇到点麻烦,所以他想问你他能否在考试周每天都能恰好买 a i a_{i} 个生煎。 ( 1 n 100000 , 1 a i 10000 ) (1\leq n\leq 100000,1 \leq a_{i} \leq 10000)

Ps:前一天购买的券必须在第二天使用,不能浪费。

intput:
第一行输入一个数,代表考试有n天,第二行输入n个数,表示每天所吃的生煎数。
output:
输出YES或NO,YES代表可以在每天恰好能买 a i a_{i} 个生煎,NO反之。

样例输入:

4
1 2 1 2

样例输出:

YES

解题思路:

这个题目的关键在于小明所持券的个数,一共可以分为两大类情况:当天有券和当天没券。

若当天没券:

  • 如果吃的生煎为奇数,则第二天持有券,如果这是最后一天,这种方案不可行
  • 如果吃的生煎是偶数,第二天无券,且满足要求

若当天有券:

  • 当天要吃的生煎个数首先减一,代表用券兑换,若剩余的生煎为偶数且不为负数,则第二天无券,满足要求
  • 若剩余的生煎为奇数且不为负数,则第二天有券,如果这是最后一天,这种方案不可行
  • 若剩余的生煎为负数,则说明该天不吃,而券又不能浪费,所以方案不可行

所有的情况都列举出来了,写代码就很容易了

解题总结:

在解题时,首先我们要理清思路,分析所有可能的情况,将所有的情况都列举出来,那么写代码就轻而易举了。

代码:

#include<iostream>
using namespace std;
int a[100001];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	int flag=0; //券的个数
	int tt=1; //方案是否可行的标志
	for(int i=0;i<n;i++)
	{
		if(flag==1)//有券
		{
			if(a[i]%2==1) 
				flag=0; 
			else if(a[i]%2==0)
			{
				if(a[i]==0) //当天不吃
				{
					tt=0;
					break;
				}
				if(i==n-1) //最后一天
				{
					tt=0;
					break;
				}
				else
				{
					flag=1;
				}
			}
		}
		else//无券
		{
			if(a[i]%2==0)
			{
				flag=0;
			}
			else if(a[i]%2==1) 
			{
				if(i==n-1) //最后一天
				{
					tt=0;
					break;
				}
				flag=1;
			}
		}
	}
	if(tt==1)
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl; 
 } 
发布了21 篇原创文章 · 获赞 4 · 访问量 900

猜你喜欢

转载自blog.csdn.net/zhL816/article/details/104874560