问题描述
小明考试周开始了,考试周一共有 天。小明决定考试周每天都吃生煎,小明每天需要买 个生煎。但是生煎店为了刺激消费,只有两种购买方式:①在某一天一次性买两个生煎。②今天买一个生煎,同时为明天买一个生煎,店家会给一个券,第二天用券来拿。没有其余的购买方式,这两种购买方式可以用无数次,但是小明是个节俭的好孩子,他考试结束就走了,不允许考试结束时手里有券。小明遇到点麻烦,所以他想问你他能否在考试周每天都能恰好买 个生煎。
Ps:前一天购买的券必须在第二天使用,不能浪费。
intput:
第一行输入一个数,代表考试有n天,第二行输入n个数,表示每天所吃的生煎数。
output:
输出YES或NO,YES代表可以在每天恰好能买 个生煎,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;
}