比赛链接:​​https://atcoder.jp/contests/abc046​

A - AtCoDeer and Paint Cans

题目大意:
问 \(3\) 个数中有多少个不同的数。

解题思路:
很多种解法,我是把数放到 set 里面去的。

示例程序:

#include <bits/stdc++.h>
using namespace std;
set<int> st;
int a;
int main() {
for (int i = 0; i < 3; i ++) {
cin >> a;
st.insert(a);
}
cout << st.size() << endl;
return 0;
}

B - Painting Balls with AtCoDeer

题目大意:
给 \(N\) 个球染 \(K\) 种颜色,要求相邻的两个求颜色不一样。问:方案数。

解题思路:
\(K \times (K-1)^{N-1}\)。

示例程序:

#include <bits/stdc++.h>
using namespace std;
int n, k, ans;
int main() {
cin >> n >> k;
ans = k;
for (int i = 1; i < n; i ++) ans *= k-1;
cout << ans << endl;
return 0;
}

C - AtCoDeer and Election Report

题目大意:
有两个比分 \(T\) 和 \(A\),他们一直是增长的,有 \(N\) 个时刻,在第 \(i\) 个时刻你需要保证比分是 \(T_i : A_i\),问最终的 \(T+A\) 的最小值是多少。

解题思路:
这是一道模拟题。其中最需要考虑的地方时如果让比分从这一轮转到下一轮(代码中用 ​​​convert(a,b,c,d)​​ 表示当前比分是 \(a\) 和 \(b\),要转成币值为 \(c:d\) 的最小的 \(a\) 和 \(b\))。

示例程序:

#include <bits/stdc++.h>
using namespace std;
// 将a和b转成c和d
void convert(long long &a, long long &b, long long c, long long d) {
long long tmp = __gcd(c, d);
c /= tmp, d /= tmp;
long long a1 = (a + c - 1) / c * c, b1 = a1 / c * d;
long long b2 = (b + d - 1) / d * d, a2 = b2 / d * c;
if (b1 < b) a = a2, b = b2;
else if (a2 < a) a = a1, b = b1;
else if (a1 < a2) a = a1, b = b1;
else a = a2, b = b2;
}
int n;
long long a, b, c, d;
int main() {
scanf("%d%lld%lld", &n, &a, &b);
for (int i = 1; i < n; i ++) {
scanf("%lld%lld", &c, &d);
convert(a, b, c, d);
}
printf("%lld", a+b);
return 0;
}

D - AtCoDeer and Rock-Paper

题目大意:
玩“石头-布”,告诉你对手的出手序列,你要设计一个出手序列,要求每一轮出布总数\(\le\)出石头总数,问:最多能拿多少分。

解题思路:
这是一道智力题吧、
经过思考发现就按照 \(gpgpgp\ldots\) 的顺序出即可。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
char s[maxn];
int cnt, c11;
int main() {
cin >> s;
for (int i = 0; s[i]; i ++) {
if (i%2 == 0) {
if (s[i] == 'p') cnt --;
}
else {
if (s[i] == 'g') cnt ++;
}
}
cout << cnt << endl;
return 0;
}