其他分享
首页 > 其他分享> > AtCoder Beginner Contest 249 赛时记录

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