吃生煎问题
小明决定n天都吃生煎,每天需要买ai个生煎。生煎店只有两种购买方式:1、在某一天一次性买两个生煎;2、今天买一个生煎,店家给一张券,明天用券来换一个生煎。没有其余的购买方式,这两种购买方式可以使用无数次,小明不允许券被浪费,也不允许n天后手里有券。请问是否能在n天每天恰好能购买ai个生煎。
输入两行,第一行输入一个正整数n(1<=n<=100000),表示天数;第二行有n个数,第i个数ai(0<=ai<=10000)表示第i天小明要买的生煎的数量。
如果可以满足小明的需求,输出“YES”,如果不能满足,输出“NO”。
sample input:
4
1 2 1 2
sample output:
YES
(存在方案:第一天选择方案二,第一天吃一个;第二天选择方案二,加上第一天的券,第二天吃两个;第三天用第二天的券,第三天吃一个;第四天选择方案一,第四天吃两个)
sample input:
3
1 0 1
sample output:
NO
(第一天选方案二,会留下一张券;第二天没用上券,所以错误)
测试点规模:
数据点1-2: n上限10 ai上限10
数据点3-5: n上限1000 ai上限10
数据点6-7: n上限10 ai上限10000
数据点8-10: n上限100000 ai上限10000
每个测试点1000ms 262144kb
思路:
- 对于第一种方式,每次都买两个,也就是说,如果在第i天要购买的是偶数,那么直接使用多个方案一即可
- 如果这一天中是奇数个生煎,那就先用多个方案一,剩余一个生煎使用方案二进行购买,余下一个券必须在i+1天使用掉
- 所以得到判断条件,如果某一天需购买的生煎数小于零(说明给的券超过了今天的购买数量,券会浪费),说明购买方式错误,输出false
- 可以利用一个bool型进行判断,如果循环完所有天数为TRUE,则输出YES;否则输出NO。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
//#include<iostream>
using namespace std;
int a[111111]={0};//保证最后一位
int main()
{
//ios::sync_with_stdio(false);
int n=0;
bool flag=true;
//cin>>n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
//cin>>a[i];
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
if(a[i]%2==1)//偶数直接跳过这一天,奇数思考和第二天的关系
{
a[i+1]--;
}
if(a[i+1]<0)
{flag=false;break;}
}
if(flag==false)printf("NO");
//"cout<<"NO";
else if(flag==true)printf("YES");
//cout<<"YES";
return 0;
}