Codeforces Round #730 (Div. 2) A~D题个人题解
比赛链接:Here
1543A. Exciting Bets
math,
给定两个数字 \(a,b (a,b \le 1e18)\) 和以下两种操作:
- \(a + 1,b+1\)
- \(a-1,b-1\ if\ a > 0\) 并且 $ b > 0$
请问经过最少多少次操作能使得 \(GCD(a,b)\) 最大化
注意:\(GCD(x,0)=x\)
输出 \(max(GCD(a,b)),min(cnt)\)
- 如果 \(a = b\) 那么直接输出 \(0,0\)
- 否则,能获得的最大 \(GCD(a,b) = |a-b|\) ,对于实现次数为 \(min(a\ mod\ g,g - a\ mod\ g)\)
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
ll a, b;
cin >> a >> b;
if (a == b)cout << "0 0\n";
else {
ll g = abs(a - b);
ll m = min(a % g, g - a % g);
cout << g << " " << m << "\n";
}
}
}
1543B. Customising the Track
给定数组 \(a\) ,给定以下操作:
可以把任意值的 \(a_i\) 转移给 \(a_j\)
求最小化 \(\sum\limits_{i = 1}^n\sum\limits_{j = i + 1}^n|a_i-a_j|\)
要最小化 \(\sum\limits_{i = 1}^n\sum\limits_{j = i + 1}^n|a_i-a_j|\) ,简单贪 \(a_i = a_j\)
如果 数组数值总和不能平均分配则把不能平均分配的数都化 1
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n; cin >> n;
ll sum = 0;
for (int i = 0; i < n; ++i) {
ll x; cin >> x;
sum += x;
}
ll t = sum / n, tt = sum % n;
cout << sum % n * (n - (sum - t * n)) << "\n";
}
}
1543C. Need for Pink Slips
(题意太长,翻译不过来)
精度!精度!还是精度!
能用
long double
就不用double
【AC Code】
using ld = long double;
const ld eps = 1e-9;
const ld scale = 1e+6;
ld solve(int c, int m, int p, int v) {
ld ans = p / scale;
if (c > 0) {
if (c > v) {
if (m > 0) ans += (c / scale) * (1 + solve(c - v, m + v / 2, p + v / 2, v));
else ans += (c / scale) * (1 + solve(c - v, 0, p + v, v));
} else {
if (m > 0) ans += (c / scale) * (1 + solve(0, m + c / 2, p + c / 2, v));
else ans += (c / scale) * (1 + solve(0, 0, p + c, v));
}
}
if (m > 0) {
if (m > v) {
if (c > 0) ans += (m / scale) * (1 + solve(c + v / 2, m - v, p + v / 2, v));
else ans += (m / scale) * (1 + solve(0, m - v, p + v, v));
} else {
if ( c > 0) ans += (m / scale) * (1 + solve(c + m / 2, 0, p + m / 2, v));
else ans += (m / scale) * (1 + solve(0, 0, p + m, v));
}
}
return ans;
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
ld cd, md, pd, vd;
cin >> cd >> md >> pd >> vd;
int c = round(cd * scale);
int m = round(md * scale);
int p = round(pd * scale);
int v = round(vd * scale);
ld ans = solve(c, m, p, v);
cout << setprecision(12) << fixed << ans << "\n";
}
}
1543D1. RPD and Rap Sheet (Easy Version)
(说实话,没看懂这题;
赛后学习一下 Pecco神 的代码
【AC Code】
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int _; for (cin >> _; _--;) {
int n, x, s = 0;
cin >> n >> x;
for (int i = 0; i < n; ++i) {
int y = (i ^ s), ok;
cout << y << "\n"
<< flush;
cin >> ok;
if (ok) break;
s ^= y;
}
}
}