acwing 4619. 减法操作

acwing4619. 减法操作

原题链接:https://www.acwing.com/problem/content/4622/

思路

这个题两种操作顺序是先进行哪个操作都是可以的。
第一个操作将某个数减2,只要是偶数就肯定能减成0,比较简单
我们可以先看第一种操作

从集合角度来证明这个题
image

最里面的集合如果有解,肯定满足外面的两个条件

为什么进行操作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;
}
posted @ 2022-09-24 23:51  r涤生  阅读(17)  评论(0编辑  收藏  举报