-
CodeForces 731B-Coupons and Discounts
-
题目链接: Coupons and Discounts
-
思路:
大意是披萨店有两种折扣方式,一是一天买两个披萨,二是一天一个披萨连续买两天,给定训练天数和每天训练队伍数(一个队伍一天吃一个披萨),在不多买的情况下问给定数据能否满足所有购买的披萨都能折扣。
要么是两天内那两块披萨折扣,要么就一次买两块进行折扣
所以从第一天开始进行遍历
a.如果有落单的披萨,那么下一天必须抽出一块一起折扣,如果下一天不买披萨,不满足要求
b.该天披萨成对买,当天的披萨全都是获得折扣的
注意:需要把已经折扣完的披萨减掉
符合要求的结果:数组全部为0(因为减去的是获得折扣的披萨,为0表示全部披萨获得折扣)
-
我跳进去的坑:
因为是遍历到最后一天,所以会出现一个问题,如果最后一天披萨数是单数,是不满足题目所要求的所有披萨都要折扣的,但是按我的思路就往后一天再抽一块披萨,但下一天没有初始化,导致bug
解决方法:把第n+1天训练队伍数设为0,防止最后一天单数个披萨错误判定
-
代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX_SIZE 200005
int Pizza_num[MAX_SIZE];
int main()
{
int n;
while (cin >> n)
{
int Break_flag = 0;
for (int i = 0; i < n; i++)
scanf("%d", &Pizza_num[i]);
Pizza_num[n] = 0; //易错
for (int i = 0; i < n; i++)
{
if (Pizza_num[i] == 0)
continue;
else
{
if (Pizza_num[i] % 2)
{
if (Pizza_num[i + 1] == 0)
{
Break_flag = 1;
break;
}
Pizza_num[i + 1] -= 1;
}
Pizza_num[i] = 0;
}
}
for (int i = 0; i < n; i++)
{
if (Pizza_num[i])
{
Break_flag = 1;
break;
}
}
if (Break_flag)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}