Codeforces Global Round 20 A - C
Codeforces Global Round 20
感觉这场难。。
https://codeforces.com/contest/1672
A.Log Chopping
思路
统计总共要被划分多少次,判断奇偶性:奇数则先手胜出,偶数则后手胜出
Code
#include <bits/stdc++.h>
using namespace std;
int main () {
int t;
cin >> t;
while (t --) {
int n;
int ans = 0;
cin >> n;
while (n --) {
int x;
cin >> x;
ans += x - 1;
}
if (ans % 2)
cout << "errorgorn" << endl;
else
cout << "maomao90" << endl;
}
}
//把要分的次数算出来,判断奇偶
B.I love AAAB
思路
全A 结尾是A 开头是B 也不行
连续的是可以的,有多少个B,前面就要至少有多少个A
(中间可以插入AA..B)
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
bool vis[N];
int main () {
int t;
cin >> t;
while (t --) {
string s;
cin >> s;
int n = s.size();
if (n == 1) {
cout << "NO" << endl;
continue;
}
if (s[n - 1] == 'A' || s[0] == 'B') {
cout << "NO" << endl;
continue;
}
vector<int> b;
for (int i = 0; i < n; i ++)
if (s[i] == 'B')
b.push_back (i);
if (b.empty()) {
cout << "NO" << endl;
continue;
}
memset (vis, false, sizeof vis);
int cnt = 0; //成功配对的数量
bool suc = true;
for (int i = b.size() - 1; i >= 0; i --) {
for (int j = b[i] - 1; j >= 0; j --) {
if (s[j] == 'A' && !vis[j]) {
vis[j] = true;
cnt ++;
break;
}
}
}
if (cnt < b.size())
suc = false;
if (suc)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
// 全A 结尾是A 开头是B 也不行
// 连续的是可以的,找对应
// 有多少个B,前面就要至少有多少个A
// 最开始有个误区!改过来就好
C.Unequal Array
思路
题意:相邻的两个数相等,则相等数++
一种迭代更新的感觉
//包含所有连续相同段的最小区间长度-3(除去头尾)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
int t, n, a[N];
signed main() {
cin >> t;
while (t --) {
int ans = 0;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
bool suc = true;
int l = -1, r = 0;
for (int i = 2; i <= n; i++) {
if (a[i] == a[i - 1]) {
if (suc)
suc = false, l = i - 1, r = i;
else
r = i;
}
}
int len = r - l + 1;
if (len > 2)
ans = max(1ll, len - 3);
else
ans = 0; //特判
cout << ans << endl;
}
return 0;
}