AtCoder Beginner Contest 048 题解
比赛链接:https://atcoder.jp/contests/abc048
A - AtCoder *** Contest
题目大意:
输入三个字符串,输出 'A' + 第二个字符串的首字母 + 'C'。
示例程序:
#include <bits/stdc++.h>
using namespace std;
string a, b, c;
int main() {
cin >> a >> b >> c;
cout << "A" << b[0] << "C" << endl;
return 0;
}
B - Between a and b ...
题目大意:
求 \([a,b]\) 中有多少个数能被 \(x\) 整除。
解题思路:
若 \(a = 0\),则答案为 \(1 + \lfloor\frac{b}{x}\rfloor\);否则,答案为 \(\lfloor\frac{b}{x}\rfloor - \lfloor\frac{a-1}{x}\rfloor\)
示例程序:
#include <bits/stdc++.h>
using namespace std;
long long a, b, x;
int main() {
cin >> a >> b >> x;
if (a == 0) cout << 1 + b / x << endl;
else cout << b / x - (a - 1) / x << endl;
return 0;
}
C - Boxes and Candies
题目大意:
给你 \(n\) 个数,每次可以选一个数减去 \(1\),求最少的操作次数,使得任意相邻两个数之和不超过 \(x\)。
解题思路:
贪心。从左到右遍历每对数(设为 a_{i-1} 和 a_i),和超过 \(x\) 则减小 \(a_i\) 至 \(a_{i-1}+a[i]=x\)。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200020;
int n;
long long x, a[maxn], ans;
int main() {
cin >> n >> x;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) {
int t = a[i-1] + a[i] - x;
if (t > 0) ans += t, a[i] -= t;
}
cout << ans << endl;
return 0;
}
D - An Ordinary Game
题目大意:
给你一个字符串,这个字符串满足“相邻字符各不相同”的性质,两个人轮流对字符串进行操作,每次操作,可以选择一个字符(首字符和尾字符除外)消掉,要求消掉这个字符后剩下的字符串仍然满足“相邻字符各不相同”的性质,第一个不能操作的人失败。问:先手赢还是后手赢?
解题思路:
这是一个博弈游戏。
最终不能取的字符串必然是如下这样的格式:\(ab\)、\(aba\)、\(abab\)、\(ababa\)、\(ababab\)、……
所以:
- 如果首字符等于尾字符,则字符串长度为奇数的是必败态(对应 \(aba\)、\(ababa\)、……);
- 如果首字符不等于尾字符,则字符串长度为偶数的是必败态(对应 \(ab\)、\(abab\)、……)。
示例程序:
#include <bits/stdc++.h>
using namespace std;
string s;
int main() {
cin >> s;
int n = s.length();
puts((n + (s[0] == s[n-1])) % 2 ? "First" : "Second");
return 0;
}