AtCoder Beginner Contest 163
比赛链接:https://atcoder.jp/contests/abc163/tasks
A - Circle Pond
题意
由半径输出圆周长。
代码
#include <bits/stdc++.h> using namespace std; int main() { double r; cin >> r; cout << 2 * 3.14 * r; }
B - Homework
题意
n 天的假期里要做 m 个任务,最终有多少天假期剩余。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int t; cin >> t; n -= t; } cout << max(-1, n); }
C - management
题意
统计 n - 1 个 1~n 的数的个数。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int cnt[n] = {}; for (int i = 0; i < n - 1; i++) { int t; cin >> t; ++cnt[t - 1]; } for (int i : cnt) cout << i << "\n"; }
D - Sum of Large Numbers
题意
从 10100+0、10100+1、10100+2、...、10100+n 中选取 k、k+1、k+2、...、n、n + 1 个数,问所有选取情况中有多少不同的值。
思路
选 i 个数的值个数 = 选 i 个数的最大值 - 选 i 个数的最小值 + 1。
f(n) - f(n - i) 是选后 i 个数,即选 i 个数的最大值,
f(i - 1) 是选前 i 个数,即选 i 个数的最小值,
ans 初始时为 1 是因为选 n + 1 个数只有一种情况。
代码
#include <bits/stdc++.h> #define f(n) ((n + 1LL) * (n) / 2) using namespace std; const int mod = 1e9 + 7; int main() { int n, k; cin >> n >> k; int ans = 1; for (int i = k; i <= n; i++) ans = (ans + f(n) - f(n - i) - f(i - 1) + 1) % mod; cout << ans; }
E - Active Infants
题意
将一个数组重新排序,每个元素的收益为 值 x 变动距离,问排序后的最大收益。
思路
先排序,然后从大到小分配元素。
dp[i][j] 表示将 i 个元素分配在左边,j 个元素分配在右边的最大收益。
代码
#include <bits/stdc++.h> using namespace std; long long dp[2020][2020]; int main() { int n; cin >> n; int a[n]; for (int &i : a) cin >> i; int p[n]; iota(p, p + n, 0); sort(p, p + n, [&] (int x, int y) { return a[x] > a[y]; }); for (int i = 0; i < n; i++) { for (int j = 0; i + j < n; j++) { int k = i + j; dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + 1LL * a[p[k]] * abs(p[k] - i)); dp[i][j + 1] = max(dp[i][j + 1], dp[i][j] + 1LL * a[p[k]] * abs(p[k] - (n - 1 - j))); } } long long ans = 0; for (int i = 0; i <= n; i++) ans = max(ans, dp[i][n - i]); cout << ans; }