A1 & A2
根据题意模拟一下。变量alice以4次操作为循环,用于判断当前摸牌的人;变量white记录当前摸 的牌是白色还是黑色,如果摸了奇数张,就更换颜色。
A2代码:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
int a[4];
memset(a, 0, sizeof(a));
int t = 0, alice = 3, white = 1;
while (1) {
t++;
if (t > n)
t = n;
if (alice >= 2) {
a[0] += t / 2;
a[1] += t / 2;
if (t % 2) {
a[0 + white]++;
white ^= 1;
}
} else {
a[2] += t / 2;
a[3] += t / 2;
if (t % 2) {
a[2 + white]++;
white ^= 1;
}
}
alice = (alice + 1) % 4;
n -= t;
if (n == 0)
break;
}
cout << a[1] << " " << a[0] << " " << a[3] << " " << a[2] << endl;
return;
}
int main() {
int n;
cin >> n;
while (n--)
solve();
}
A1的输出改为
cout << a[1] + a[0] << " " << a[3] + a[2] << endl;
B
设c为蛋糕中心和注射器中心的距离,经过思考可以发现,当max(c) - min(c) > (w - h) * 2时,找不到符合题意的情况。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
ll n, w, h;
cin >> n >> w >> h;
ll a[n], b[n], maxc, minc;
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
}
for (int i = 0; i < n; i++) {
scanf("%lld", &b[i]);
ll dd = a[i] - b[i];
if (i == 0) {
maxc = dd;
minc = dd;
} else {
maxc = max(maxc, dd);
minc = min(minc, dd);
}
}
if (maxc - minc > (w - h) * 2)
cout << "NO";
else
cout << "YES";
cout << endl;
return;
}
int main() {
int n;
cin >> n;
while (n--)
solve();
}
C 排序后保证最大增量为1,得出答案。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
ll n;
cin >> n;
ll a[n + 1];
for (ll i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
a[0] = 0;
sort(a + 1, a + n + 1);
ll sum = 0;
for (ll i = 1; i <= n; i++) {
ll dd = a[i] - a[i - 1];
if (dd > 1) {
sum += dd - 1;
a[i] -= dd - 1;
}
}
cout << sum << endl;
return;
}
int main() {
int n;
cin >> n;
while (n--)
solve();
}
D 如果其中两个能换就直接换(如多w缺n和多n缺w,交换一次),不能换的话就肯定会形成三元交换环(如多w缺i,多i缺n,多n缺w),交换环需要交换两次。
参考代码(引用于jiangly):
void solve() {
int n;
std::cin >> n;
std::vector<std::string> s(n);
for (int i = 0; i < n; i++) {
std::cin >> s[i];
}
std::map<std::pair<char, char>, std::vector<int>> a;
std::vector<std::tuple<int, char, int, char>> ans;
for (int i = 0; i < n; i++) {
std::map<char, int> cnt;
for (auto x : s[i]) {
cnt[x]++;
}
std::vector<char> need;
std::vector<char> give;
for (auto x : {'w', 'i', 'n'}) {
if (cnt[x] == 0) {
need.push_back(x);
} else {
for (int i = 1; i < cnt[x]; i++) {
give.push_back(x);
}
}
}
for (int j = 0; j < need.size(); j++) {
char x = need[j], y = give[j];
if (!a[{y, x}].empty()) {
ans.emplace_back(i, y, a[{y, x}].back(), x);
a[{y, x}].pop_back();
} else {
a[{x, y}].push_back(i);
}
}
}
char ch[3] = {'w', 'i', 'n'};
if (a[{ch[0], ch[1]}].empty()) {
std::swap(ch[0], ch[1]);
}
for (int i = 0; i < a[{ch[0], ch[1]}].size(); i++) {
int x = a[{ch[0], ch[1]}][i];
int y = a[{ch[1], ch[2]}][i];
int z = a[{ch[2], ch[0]}][i];
ans.emplace_back(x, ch[1], y, ch[2]);
ans.emplace_back(x, ch[2], z, ch[0]);
}
std::cout << ans.size() << "\n";
for (auto [a, b, c, d] : ans) {
std::cout << a + 1 << " " << b << " " << c + 1 << " " << d << "\n";
}
}