一共有N天,对应每天需要购买的披萨数目已知,对应当前天可以有两种操作:
①直接买两个披萨
②买一个披萨,并且对下一天预定一个披萨,那么到第二天的时候,那个披萨就相当于买了。
问能否通过上述两种操作将这N天的披萨数都正好对应的购买。
思路:
1、首先考虑如果第N天预定了披萨,那么N+1天的时候就购买了一个披萨,明显这是我们不想要的结果。那么我们贪心的点从这个角度出发。最后一天不能进行预定操作,那么如果最后一天是一个奇数,那么显然那个多余出来的1,一定是从上一天预定过来的。
2、那么根据这个特性,我们逆序思维,从最后一天开始向前处理,如果当前天的数是一个奇数,那么对应一定从前一天预定了一份披萨到今天,那么a【i-1】-=1;那么在这个向前推的过程中遇到了a【i】<0的时候,一定是NO的情况。
3、那么对应已知向前推,一直推到第一个的时候,判断第一个的奇偶性,如果其实奇数,那么输出NO,否则就是YES、
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int a[2004000];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int flag=0;
for(int i=n-1;i>=0;i--)
{
if(a[i]<0)
{
flag=0;break;
}
if(i!=0)
{
if(a[i]%2==1)
{
a[i-1]-=1;
}
}
else if(a[i]%2==0)flag=1;
else flag=0;
}
if(flag==1)printf("YES\n");
else printf("NO\n");
}
}