传送门:洛谷 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;
}