CF1856B Good Arrays 题解
liruixiong0101 · · 题解
P0 题意:
给出一个长度为
-
a_i\neq b_i(i\in[1,n]) -
\sum_{i=1}^{n} a_i=\sum_{i=1}^{n} b_i
P1 思路:
1.我的错误思路:
一开始我想到了错位,将
2.正确思路:
(我也不知道我的思路对不对捏。
由于此题的序列为正整数序列,所以我们肯定会想到让前 NO。操作如下:
- 若
a_i=1 :b_i:=2 。 - 若
a_i\neq1 :b_i:=1 。
很容易发现一个东西,若
-
将
b_n:=b_n+1 :这样只能让b_i:=b_i-1(i\in[1,n)) ,这样又可以分为两种情况:- 若
b_i=1 :b_i-1=0 ,不合法。 - 若
b_i=2 ,则a_i=1 :b_i-1=a_i ,不合法。
这种情况是不可能出现的。
- 若
- 将
b_n:=b_n-1 :这种情况必须先保证b_n\neq1 ,接着只能让b_i:=b_i+1(i\in[1,n)) ,这样只要出现了一个i(i\in[1,n)) ,b_i+1\neq a_i 那么就一定合法。
P3 代码:
代码就很好实现了,代码如下:
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int kMaxN = 1e5 + 5;
int T, n;
LL suma, sumb, a[kMaxN], b[kMaxN];
int main() {
for (cin >> T; T; T--, suma = sumb = 0) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i], suma += a[i];
} // 输入序列a,记录序列a的元素总和
for (int i = 1; i < n; i++) {
b[i] = a[i] == 1 ? 2 : 1; // 计算出b[1...n-1]
sumb += b[i]; // 记录b[1...n-1]的和
}
if (sumb >= suma) { // b[n]<=0
cout << "NO\n";
continue;
}
b[n] = suma - sumb;
if (a[n] == b[n]) { // 判断最后一位是否相同
bool f = 0;
for (int i = 1; i < n; i++) {
if (b[i] + 1 != a[i] && b[n] > 1) {
cout << "YES\n", f = 1;
b[i]++, b[n]--;
break;
}
}
cout << (!f ? "NO\n" : "");
} else {
cout << "YES\n";
}
}
return 0;
}
AC 记录:https://codeforces.com/contest/1856/submission/217407090