传送门:洛谷 Array Fix | Codeforces B. Array Fix

更佳的阅读体验:CF1948B 题解


简要题意:给定一个长度为 $n$ 的非负整数序列 $a$,可以任意次选择序列中的一个数,将其从原序列中删除,然后将这个数字十进制上的每一位数,按原顺序放回序列。判断是否可能使得这个序列变得单调不降。

我们可以从后往前遍历整个序列。如果发现当前数大于后面的数,那么有两种情况;

  • 当前数是一位数,不能拆分,因此直接判定无合法方案。
  • 当前数是两位数,就进行拆分。拆分后需要继续判断,如果十位大于个位,也直接判定无合法方案。

遍历时,使用一个变量记录当前数后面的数,遇到拆分数字时就能避免改变数组内部的元素。

#include <iostream>
using namespace std;

const int N = 60;
int t, n, a[N], last;
bool flag;

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    for (cin >> t; t; --t) {
        flag = false;
        cin >> n;
        for (int i = 1; i <= n; ++i) cin >> a[i];
        last = a[n];
        for (int i = n - 1; i >= 1; --i) {
            if (a[i] > last) {
                if (a[i] % 10 > last) {
                    flag = true;
                    break;
                } if (a[i] >= 10) {
                    if (a[i] / 10 > a[i] % 10) {
                        flag = true;
                        break;
                    } last = a[i] / 10;
                } else last = a[i];
            } else last = a[i];
        } cout << (flag ? "NO\n" : "YES\n");
    } return 0;
}
最后修改:2024 年 03 月 18 日
如果觉得我的文章对你有用,请随意赞赏