AtCoder Beginner Contest 249 赛时记录
作者:互联网
目录
赛时只切了 4 题,2022 开年来的第一次,输麻了/ll
掉大分
安慰一下自己,常在河边走,哪有不掉分~
A - Jogging
直接按照题目要求的模拟一下,看看谁的得分高就可以。
tnnd 题面一开始错了,WA 了一发,比着题面和样例看了半天才看出来/px
B - Perfect String
随便拿个桶记录下就好了。
C - Just K
\(n\) 很小,直接 \(2^n\) 枚举,然后 \(O(26n)\) 求一下价值,对价值取个 \(\max\) 就好了。
signed main() {
int n = read(), K = read();
for(int i = 1; i <= n; ++i) {
cin >> s + 1;
int len = strlen(s + 1);
for(int j = 1; j <= len; ++j) {
cnt[i][s[j] - 'a'] ++;
}
}
int Max = 0;
for(int S = 0; S < (1 << n); ++S) {
int ans = 0;
for(int i = 0; i < 26; ++i) {
int res = 0;
for(int j = 1; j <= n; ++j) {
if(!((S >> j - 1) & 1)) continue;
res += cnt[j][i];
}
if(res == K) ans ++;
}
// cout << S << " " << ans << "\n";
Max = max(Max, ans);
}
cout << Max << "\n";
return 0;
}
D - Index Trio
发现 \(a_i \le 2 \times 10^5\),果断把 \(a_i\) 扔到值域上统计出现次数。
然后暴力枚举一下 \(i\) 和 \(i \times j\) 就好了,复杂度是喜闻乐见的调和级数 \(\mathcal O(V \ln V)\)。
注意我们并不需要考虑去重的问题。
signed main() {
n = read();
for(int i = 1; i <= n; ++i) cnt[read()] ++;
int M = 200000;
for(int i = 1; i <= M; ++i)
for(int j = i; j <= M; j += i)
ans += cnt[i] * cnt[j] * cnt[j / i];
cout << ans << "\n";
return 0;
}
F - Ignore Operations
因为还没调出来,先口胡一下做法。
就是倒着枚举,遇到 \(t_i=1\) 的时候,看一下从这里到最后获得的价值最大是多少,对答案去一个 \(\max\)。过去之后要用一次跳来消除这个位置的影响。
动态维护一个 \(sum\),每遇到一个 \(t_i = 2\),如果 \(y_2 \ge 0\),那么可以不用跳。否则的话,把它扔进一个堆里,如果堆里的元素个数 \(>K\),取出最小的加进 \(sum\) 中。
中途如果扫过 \(t_i=1\) 后 \(K<0\),那么可以直接 break
掉。
最后直接输出答案即可。
标签:Perfect,AtCoder,赛时,Beginner,int,一下,read,枚举,main 来源: https://www.cnblogs.com/Silymtics/p/ABC249.html