AtCoder Beginner Contest 156
比赛链接:https://atcoder.jp/contests/abc156
A - Beginner
题意
如果 $n<10$,输出 $r+100\times(10-n)$,否则输出 $r$ 。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n, r; cin >> n >> r; cout << r + 100 * max(0, 10 - n); }
B - Digits
题意
计算 $n$ 在 $k$ 进制下的位数。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; int cnt = 0; while (n) n /= k, ++cnt; cout << cnt; }
C - Rally
题意
数轴上有 $n$ 个人,将一个人从点 $x$ 移到 $p$ 的花费为 $(x-p)^2$,计算将所有人移到同一点的最小花费。$(1≤n≤100,1≤x≤100)$
题解
依次枚举端点即可。
不能枚举每个人的位置:如 $1,3$,此时移动到不是任何人的位置的 $2$ 是最优的。
不能枚举平均值:如 $1,1,1,1,1,3$,此时移动到不为平均值 $2$ 的 $1$ 是最优的。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int x[n] = {}; for (int i = 0; i < n; i++) cin >> x[i]; int ans = INT_MAX; for (int p = 1; p <= 100; p++) { int sum = 0; for (int i = 0; i < n; i++) sum += (x[i] - p) * (x[i] - p); ans = min(ans, sum); } cout << ans << "\n"; }
D - Bouquet
题意
有 $n$ 朵不同的花,要求所用花的数量不能为 $a$ 或 $b$,计算可以组成多少不同的花束。
题解
用 $1$ 朵花的花束个数:$C_n^1$
用 $2$ 朵花的花束个数:$C_n^2$
用 $3$ 朵花的花束个数:$C_n^3$
……
用 $n$ 朵花的花束个数:$C_n^n$
即,$ans = 2^n - C_n^a - C_n^b - C_n^0$
代码
#include <bits/stdc++.h> using ll = long long; using namespace std; const int mod = 1e9 + 7; ll fpow(ll a, ll b) { ll res = 1; while (b > 0) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } ll inv(ll x) { return fpow(x, mod - 2); } ll C(ll n, ll m) { ll res = 1; ll mi = min(m, n - m); for (int i = 1; i <= mi; i++) res = res * (n - i + 1) % mod * inv(i) % mod; return res; } int main() { ll n, a, b; cin >> n >> a >> b; cout << (fpow(2, n) - C(n, a) - C(n, b) - 1 + mod + mod) % mod; }