比赛链接: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 + lfloorfrac{b}{x}
floor);否则,答案为 (lfloorfrac{b}{x}
floor - lfloorfrac{a-1}{x}
floor)
示例程序:
#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;
}