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;
}
posted @ 2021-03-04 16:01  quanjun  阅读(89)  评论(0编辑  收藏  举报