题目描述:
咕咕东考试周开始了,考试周一共有n天。他不想考试周这么累,于是打算每天都吃顿好的。他决定每天都吃生煎,咕咕东每天需要买ai个生煎。但是生煎店为了刺激消费,只有两种购买方式:①在某一天一次性买两个生煎。②今天买一个生煎,同时为明天买一个生煎,店家会给一个券,第二天用券来拿。没有其余的购买方式,这两种购买方式可以用无数次,但是咕咕东是个节俭的好孩子,他训练结束就走了,不允许训练结束时手里有券。咕咕东非常有钱,你不需要担心咕咕东没钱,但是咕咕东太笨了,他想问你他能否在考试周每天都能恰好买ai个生煎。
输入格式:
输入两行,第一行输入一个正整数n(1<=n<=100000),表示考试周的天数。
第二行有n个数,第i个数ai(0<=ai<=10000)表示第i天咕咕东要买的生煎的数量。
输出格式:
如果可以满足咕咕东奇怪的要求,输出"YES",如果不能满足,输出“NO”。(输出不带引号)
题目思路:
既然要求最后没有券,说明平时能不得到券就不要得到,也就是如果买的生煎个数很大的时候应该优先选择购买一次性两个的方案,然后在看有没有剩余没买的生煎,还有一个就需要用到券了。
那么我们的处理方案就是:
首先看如果不需要买生煎,就跳过去到下一天
if(a[i]==0)
{
continue;
}
如果需要买的生煎个数≥2,看看自己有没有券,如果没有就一直买直到个数≤1
if(a[i]>=2&&b[i]==0)
{
while(a[i]>=2)
a[i]=a[i]-2;
}
当然如果有券,那么一定要先用掉券(这是题目要求),然后用掉券之后再如上处理
if(a[i]>=2&&b[i]==1)
{
count--;
a[i]=a[i]-1;
b[i]=0;
while(a[i]>=2)
a[i]=a[i]-2;
}
如果需要买一个,那么就看有没有券,有券那就直接用
if(a[i]==1&&b[i]==1)
{
count--;
a[i]=0;
b[i]=0;
}
如果没有券,那就买一个然后得到一个券,明天再花
if(a[i]==1&&b[i]==0)
{
count++;
a[i]=0;
b[i+1]=1;
}
最后看看还有多少,没有了就yes,有就no
if(count==0)
{
cout<<"YES";
}
else
{
cout<<"NO";
}
代码如下:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100001];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
bool b[100005]={0};//记录当天是否有券
int count=0;//记录剩余的券
for(int i=0;i<n;i++)
{//各个if分析见上面
if(a[i]>=2&&b[i]==0)
{
while(a[i]>=2)
a[i]=a[i]-2;
}
if(a[i]>=2&&b[i]==1)
{
count--;
a[i]=a[i]-1;
b[i]=0;//当天的花完了,这样也防止进入下面b==1的if
while(a[i]>=2)
a[i]=a[i]-2;
}
if(a[i]==0)
{
continue;
}
if(a[i]==1&&b[i]==0)
{
count++;
a[i]=0;
b[i+1]=1;//今天买明天用,所以是明天的为1
}
if(a[i]==1&&b[i]==1)
{
count--;
a[i]=0;
b[i]=0;
}
}
if(count==0)
{
cout<<"YES";
}
else
{
cout<<"NO";
}
}