acwing 4619. 减法操作
acwing4619. 减法操作
原题链接:https://www.acwing.com/problem/content/4622/
思路
这个题两种操作顺序是先进行哪个操作都是可以的。
第一个操作将某个数减2,只要是偶数就肯定能减成0,比较简单
我们可以先看第一种操作
从集合角度来证明这个题
最里面的集合如果有解,肯定满足外面的两个条件
为什么进行操作2的时候,要对这个数的后面相邻的数进行操作2:
枚举第一个奇数,我们如果对其前面相邻的数进行操作2,那么这个奇数会变成偶数,而其前面的偶数会变成奇数,这个奇数要想变成偶数就要和它前面的数进行操作2,会发现始终会有一个奇数,所以整个方法不可行。
而如果对枚举第一个奇数,将这个奇数和其后面的相邻的数进行操作2,那么是有可能做到没有奇数的局面。
所以做法就是递推:
从前往后枚举每个奇数,将这个奇数及其后相邻的数进行操作2。
从前往后枚举每个数,如果这个数列是非负整数数列,那么是有解的
代码
#include<iostream>
using namespace std;
const int N = 200010;
int n,a[N];
bool check()
{
for(int i = 0; i < n - 1; i ++)
if(a[i] % 2) a[i] --,a[i + 1] --;
for(int i = 0; i < n; i ++)
if(a[i] % 2 || a[i] < 0 ) return false;
return true;
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i ++) scanf("%d",&a[i]);
if(check()) puts("YES");
else puts("NO");
return 0;
}
rds_blogs