A
模拟即可。
void solve() {
int n; cin >> n;
vector<int> a(n), b(n);
int cnt1 = 0, cnt2 = 0;
for (int i = 0;i < n;i++) {
cin >> a[i];
if (a[i]) cnt1 ++;
}
for (int i = 0;i < n;i++) {
cin >> b[i];
if (b[i]) cnt2 ++;
}
int ans = 0;
if (a == b) {
cout << ans << endl;
return;
}
else if (cnt1 > cnt2) {
ans = cnt1 - cnt2;
for (int i = 0;i < n;i++) {
if (a[i] == 0 && b[i] == 1) {
ans++;
break;
}
}
}
else if (cnt2 >= cnt1) {
ans = cnt2 - cnt1;
for (int i = 0;i < n;i++) {
if (b[i] == 0 && a[i] == 1) {
ans++;
break;
}
}
}
cout << ans << endl;
}
B
我们可以发现如果能找到这样的序列,根据\(gcd\)的定义,有任意\(a[i] \ mod \ (gcd(a[i-1],a[i+1]))\neq{0}\), 否则一定有相邻三项之间出现矛盾。
void solve() {
int n; cin >> n;
vector<int> a(n + 1);
for (int i = 1;i <= n;i++) cin >> a[i];
a[0] = a[1];
bool ok = true;
for (int i = 1;i < n - 1;i++) {
if (a[i + 1] % gcd(a[i], a[i + 2]) != 0) ok = false;
}
cout << (ok ? "YES\n" : "NO\n");
}
C
考虑怎么统计答案。
对于任意\(a[i]\),我们考虑以\(a[i]\)为终点向前延申,最多能延伸的长度为多少,有递推公式:\(len[i]=min(len[i-1]+1,a[i])\)。
则\(ans=\sum {len[i]}\),可以\(O(n)\)求解。
void solve() {
int n; cin >> n;
vector<int> a(n + 1), res(n + 1);
ll ans = 0;
for (int i = 1;i <= n;i++) {
cin >> a[i];
res[i] = min(res[i - 1] + 1, a[i]);
ans += res[i];
}
cout << ans << endl;
}
标签:int,Codeforces,cin,++,cnt2,cnt1,ans,825,Div
From: https://www.cnblogs.com/coldarra/p/16778858.html