标签:Perfect AtCoder 赛时 Beginner int 一下 read 枚举 main
目录赛时只切了 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。