AtCoder Beginner Contest 046
A - AtCoDeer and Paint Cans
可由 \(\rm set\) 的性质轻松解决。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
set<int> s;
for (int i = 0; i < 3; i++) {
int x;
cin >> x;
s.insert(x);
}
cout << s.size();
return 0;
}
B - Painting Balls with AtCoDeer
做一件事,完成它需要分成 \(n\) 个步骤,且做第 \(1\) 步有 \(m_1\) 种不同的方法,做第 \(2\) 步有 \(m_2\) 不同的方法,…… 做第 \(n\) 步有 \(m_n\) 不同的方法。
那么完成这件事共有:\(N=m_1×m_2×m_3×…×m_n\) 种不同的方法。
第一个位置有 \(k\) 种涂法,相邻位置颜色不能相同,第二个位置可以涂 \(k×(k-1)^1\) 种颜色,...总共有 \(n\) 个位置,共有 \(k×(k-1)^{n-1}\) 种涂法。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int N, K;
cin >> N >> K;
int ans = K;
for (int i = 0; i < N - 1; i++) ans *= (K - 1);
cout << ans;
return 0;
}
C - AtCoDeer and Election Report
票数总和要求最少,由于满足比例关系,那么各自的票数也应该最少。则题意转变为:给出两个数 \(A,B\)。只可以对 \(A,B\) 进行加操作,使其满足 \(A :B = a : b\) 且操作后 \(A,B\) 最小。
可知 \(A=ak\),\(B=bk\)。由于只能加操作,所以 \(k\) 等于 \(A/a\) \(\rm or\) \(B/b\) 向上取整后的结果。这两个结果需要取 \(\rm max\) 后与 \(a\)、\(b\) 相乘,因为只能加操作。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
i64 _ceil(i64 x, i64 y) {//实现x / y向上取整(记忆!)
return (x + y - 1) / y;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int N;
cin >> N;
int t, a;
cin >> t >> a;
i64 A = t, B = a;//t、a互素,初始票数与之相等
for (int i = 1; i < N; i++) {
int x, y;
cin >> x >> y;
A = x * _ceil(A, x);
B = y * _ceil(B, y);//先将A,B变成x,y的倍数,再看是否符合比例关系:
if (A / x < B / y) {//A偏小,按比例关系更改
A = B / y * x;
} else {
B = A / x * y;//B偏小,按比例关系更改
}
}
cout << A + B;
return 0;
}
D - AtCoDeer and Rock-Paper
贪心。
只能出布或锤子,很明显的是出布更有优势(平局或胜利),而锤子(平局或负)不利。因此应该尽可能的多出布。题目又要求出锤子的数量 \(\geqslant\) 出布的数量,因此可以直接分别计算出两个数量。先遍历一遍字符串,优先把布的处理掉,然后再处理对方出锤子的情况。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
string s;
cin >> s;
int n = s.size(), ans = 0;
int g = (n + 1) / 2, p = n - g;
for (int i = 0; i < n; i++) {
if (s[i] == 'p' && p > 0) {
p--;
}
}
for (int i = 0; i < n; i++) {
if (s[i] == 'g' && p > 0) {
p--;
ans++;
}
}
cout << ans;
return 0;
}

浙公网安备 33010602011771号