「题解」Codeforces Round 993 (Div.4)
A
给 Cube 一个整数 。她想知道有多少对有序的正整数 能使 成对。由于 Cube 不擅长数学,请帮助她!
考虑到数据范围较小(),暴力枚举即可。
void solve() {
int n;
cin >> n;
int ans = 0;
for (int i = 1; i <= 1000; i ++) {
for (int j = 1; j <= 1000; j ++) {
if (i + j == n)
ans ++;
}
}
cout << ans << "\n";
}以上是为了拼手速尽快 A 题想出来的神秘解法,稍微分析一下就可以知道答案是 。
B
一家商店的玻璃橱窗上画着一串只有字符 "p"、"q "和 "w "的字符串。Ship 走过商店,站在玻璃橱窗正前方,观察到字符串 。然后,小船走进商店,直视同一玻璃橱窗,观察到字符串 。
飞船给出字符串 。您的任务是找到并输出 。
考虑到镜像的特点,倒序输出的同时把 p 和 q 互换即可。
void solve() {
string s;
string t = "";
cin >> s;
int ans = 0;
for (int i = s.length() - 1; i >= 0; i --) {
if (s[i] == 'p')
t += 'q';
if (s[i] == 'q')
t += 'p';
if (s[i] == 'w')
t += s[i];
}
cout << t << "\n";
}C
波尔是纸折大学的老师。他教室里的座位排成 行,每行有 个座位。
波尔正在给 只猴子上课,他想给尽可能多的猴子分配座位。波尔知道 只想坐在第 排, 只想坐在第 排, 没有任何偏好。每个座位只能坐一只猴子,而且每只猴子都必须按照自己的偏好入座。
波尔最多可以让多少只猴子坐下?
小学数学。
void solve() {
int m, a, b, c;
cin >> m >> a >> b >> c;
int ans = 0;
if (a <= m) {
ans += a;
} else {
ans += m;
}
if (b <= m) {
ans += b;
} else {
ans += m;
}
if (ans <= 2 * m) {
if (c) {
ans = min(2 * m, ans + c);
}
}
cout << ans << "\n";
}D
给定一个正整数序列,如果一个正整数出现的次数是任何一个正整数出现的最大次数,那么这个正整数就称为序列的模。例如, 的模是 。 、 或 中的任何一个都可视为序列 的模。
你给了 UFO 一个长度为 的数组 。为了感谢你,UFO 决定再构造一个长度为 的数组 ,使得 是数列 中所有 的模式。
然而,UFO 不知道如何构造数组 ,所以你必须帮助她。请注意,在所有 中,你的数组 必须成立。
考虑到 且 ,因此本题可以看作一个排列问题。在此基础上,我们可以发现 的排列的众数是其本身(即每个数都只出现一次)。因此我们只需要根据 调整 的顺序即可。
void solve() {
int n;
cin >> n;
vector<int> a(n);
vector<int> f(n + 1);
for (int &v : a) {
vector<int> f(n + 1);
for (int &v : a) {
cin >> v;
}
vector<int> b(n);
for (int i = 0; i < n; i ++) {
if (!f[a[i]]) {
f[a[i]] ++;
b[i] = a[i];
}
}
int p = 0;
for (int i = 0; i < n; i ++) {
if (b[i] == 0) {
for (int j = p + 1; j <= n; j ++) {
if (f[j] == 0) {
p = j;
break;
}
}
b[i] = p;
}
cout << b[i] << " ";
}
cout << "\n";
}E
小波得到五个整数 , , , 和 。小波希望你帮她计算出满足以下所有条件的有序数对 的个数:
- .
- .
- 存在一个非负整数 ,使得 .
提前计算好 ,约束 的范围枚举即可。
void solve() {
int k, l1, r1, l2, r2;
cin >> k >> l1 >> r1 >> l2 >> r2;
int ans = 0;
vector<int> kn;
int tmp = 1;
while (tmp <= r2) {
kn.push_back(tmp);
if (tmp > r2 / k) break;
tmp *= k;
}
for (int power : kn) {
int x_min = max((l2 + power - 1) / power, l1);
int x_max = min(r2 / power, r1);
if (x_min <= x_max) {
ans += (x_max - x_min + 1);
}
}
cout << ans << "\n";
}