吃生煎:求是否数量恰好。c++

吃生煎问题

小明决定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;
}
发布了29 篇原创文章 · 获赞 1 · 访问量 946

猜你喜欢

转载自blog.csdn.net/qq_44654498/article/details/104902529
今日推荐