Educational Codeforces Round 104 (Rated for Div.2) - 题解
A. Arena
翻译:
有 \(n\) 个人正在战斗,我们用 \(a_i\) 表示第 \(i\) 个人的实力。每分钟都会发生一次随机的两个人(注意不能两人是同一人)之间的对决,实力高的人将会获胜,胜者的实力可以 \(+1\)。问有多少人有可能能赢至少 \(100^{500}\) 场对决。
Solution
每一场对决的两人都是随机的,等同于说就是让你指定的。
那么如果我们想让某人赢至少 \(100^{500}\) 场对决,该怎么办?
如果TA不是这群人中实力最弱的,那么我们就让他欺负 \(100^{500}\) 次最弱的人就行了!(有点不厚道呢)
如果TA是实力最弱的......
显然,TA一场对决都赢不了,所以TA不可能赢至少 \(100^{500}\) 场对决了。
因此解法就很显然了,枚举每一个人,如果TA的实力不是实力最弱的,就让答案 \(+1\)。
Code
#include <bits/stdc++.h>
using namespace std;
int t, n, a[105], ans, minn;
int main() {
scanf("%d", &t);
while (t--) {
ans = 0, minn = 2003;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
minn = min(minn, a[i]);
}
for (int i = 1; i <= n; i++)
if (a[i] != minn) ans++;
printf("%d\n", ans);
}
return 0;
}
B. Cat Cycle
Solution
显然 \(n\) 为偶数时两只猫不会相遇。
而当 \(n\) 为奇数时,我们可以发现猫 B 每过 \(\lfloor \frac{n}{2} \rfloor\) 小时都会与猫 A 相遇。
所以过了 \(k\) 小时后猫 B 会比计划多移动 \(\lfloor \frac{k-1}{\lfloor \frac{n}{2} \rfloor} \rfloor\) 个睡觉地点。
Code
#include <bits/stdc++.h>
using namespace std;
int t, n, k, length;
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d %d", &n, &k);
if (n&1) k += (k-1)/(n/2);
printf("%d\n", (k-1)%n+1);
}
return 0;
}
C. Mininum Ties
Solution
显然每只队伍需要比 \(n-1\) 场比赛。可以考虑根据奇偶分类讨论。
如果 \(n\) 为奇数,我们可以让每一队都赢一半比赛,可以做到 \(0\) 场平局。
如果 \(n\) 为奇数,我们计算出在使得平局数量最少的情况下每一队的得分,再使用 \(num\) 数组维护每一队在比完每一场比赛后的得分。
接着比较 \(num_i\) 与期望得分的大小就可以判定这一场的胜负了。
Code
#include <bits/stdc++.h>
using namespace std;
int t, n, num[105], score;
int main() {
scanf("%d", &t);
while (t--) {
memset(num, 0, sizeof(num));
scanf("%d", &n);
if (n == 2) {
printf("0\n");
continue;
}
if (n & 1) {
for (int i = 1; i < n; i++) {
for (int j = i+1; j <= n; j++) {
if (num[i] <= 0) {
printf("1 ");
num[i]++;
} else {
printf("-1 ");
num[i]--;
}
}
}
printf("\n");
} else {
score = (3*(n-1)-1)/2;
for (int i = 1; i < n; i++) {
for (int j = i+1; j <= n; j++) {
if (num[i] <= score-3) {
printf("1 ");
num[i] += 3;
} else if (num[i] < score) {
printf("0 ");
num[i] += 1;
num[j] += 1;
} else {
printf("-1 ");
num[j] += 1;
}
}
}
printf("\n");
}
}
return 0;
}
D. Pythagorean Triples
Solution
一道纯的推柿子题。
假设元组 \((a, b, c)\) 满足要求,则显然有
\(\begin{equation} \left\{ \begin{array}{lr} a^2 + b^2 = c^2 & \\ a^4 - 2a^2b + b^2 = c^2 \end{array} \right. \end{equation}\)
两式相减,得
\(a^4 = a^2(2b+1)\)
因此
\(a^2 = 2b + 1\)
带入①式,有
\(b^2 + 2b + 1 = c^2\)
是不是很熟悉?所以
\((b+1)^2 = c^2\)
\(b + 1 = c\)
这时我们来看看范围,\(1 \le a \le b \le c \le n\),所以 \(b \le n-1\),从而有 \(a^2 \le 2n-1\)
因此 \(a \le \sqrt{2n-1}\)
而因为 \(b\) 为正整数而 \(a^2 = 2b+1\),故 \(a\) 必为奇数
注意 \(a\) 为 \(1\) 时 \(b = 0\) 不成立
Code
#include <bits/stdc++.h>
using namespace std;
int t, n, maxn;
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
n = 2*n-1;
maxn = int(sqrt(n));
printf("%d\n", (maxn-1)/2);
}
return 0;
}

浙公网安备 33010602011771号