[CF1092D1] Great Vova Wall - 栈,贪心

[CF1092D1] Great Vova Wall - 栈,贪心

Description

给定一个序列 \(a=\{a_1,a_2,\dots,a_n\}\),有以下两种操作:若 \(a_i=a_{i+1}\),则可将 \(a_i\) 与 \(a_{i+1}\) 同时加 \(1\);将 \(a_i\) 加 \(2\)。求问是否可经过多此操作后使得所有 \(a_i\) 相等。

Solution

相当于按奇偶性做匹配,不难想到用栈维护,碰到奇偶性相同的就消去,如果最后栈内剩余元素数量不超过 1 则 YES

#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main()
{
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    vector<int> a(n + 2);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    vector<int> s(n + 2);
    int top = 0;
    for (int i = 1; i <= n; i++)
    {
        s[++top] = a[i] & 1;
        if (top > 1 && s[top] == s[top - 1])
            top -= 2;
    }
    cout << (top <= 1 ? "YES" : "NO") << endl;
}
上一篇:flyway


下一篇:Basic Wall Maze POJ - 2935简单bfs