AtCoder Beginner Contest 159
比赛链接:https://atcoder.jp/contests/abc159/tasks
A - The Number of Even Pairs
题意
已知奇偶数的个数,求和为偶数的数对个数。
代码
#include <bits/stdc++.h> using namespace std; long long Cn_2(int i){ return 1LL * i * (i - 1) / 2; } int main() { int n, m; cin >> n >> m; cout << Cn_2(n) + Cn_2(m); return 0; }
B - String Palindrome
题意
判断一个字符串和以中心为分界点的两个子串是否回文。
代码
#include <bits/stdc++.h> using namespace std; int main() { string s, r_s; cin >> s; r_s = s; reverse(r_s.begin(), r_s.end()); if(s == r_s){ s = s.substr(0, s.size() / 2); r_s = s; reverse(r_s.begin(), r_s.end()); if(s == r_s) return 0 * puts("Yes"); } return 0 * puts("No"); }
C - Maximum Volume
题意
已知长方体三边和,求最大体积。
思路
$L=a+b+c\ge3\sqrt[3]{abc}$
代码
#include <bits/stdc++.h> using namespace std; int main() { double a, b, c, tot_len; cin >> tot_len; a = b = c = tot_len / 3.0; printf("%.12f", a * b * c); return 0; }
D - Banned K
题意
有一数列,问每个数外两两相同的数有多少对。
思路
求出所有值两两相同的总对数,每个数的值再重新计算。
代码
#include <bits/stdc++.h> using namespace std; long long Cn_2(int i){ return 1LL * i * (i - 1) / 2; } int main() { map<int, int> m; int n; cin >> n; int a[n]; for(int & i : a) cin >> i, ++ m[i]; long long sum = 0; for(auto i : m) sum += Cn_2(i.second); for(int i : a) cout << sum - Cn_2(m[i]) + Cn_2(m[i] - 1) << "\n"; return 0; }
E - Dividing Chocolate
题意
有一 $H{\times}K$ 的黑白矩阵,问使得分割后每块白色不多于 K 个的最少切割次数。
思路
$H$ 不大于 $10$,可以枚举每行的选举情况,然后利用二维前缀和计算白色的个数贪心切割矩阵的列。(待填)
代码
待填
F - Knapsack for All Segments
题意
求一数列所有的连续区间中和为 $S$ 的子区间个数和。(如数列 $2\ 2\ 4$,$S=4$,有$[1,2]=1$,$[1,3]=2$,$[2,3]=1$,$[3,3]=1$, 共 $5$ 个)。
思路
可以非常巧妙地化为 01 背包求解,详见博主 st1vdy 的做法。
代码
待填

浙公网安备 33010602011771号