2021 ICPC 沈阳站 ( E, F题 )

2021 ICPC 沈阳站 E, F题

第一场区域赛,清楚自己的实力,在队里说两题就算赢,最后确实两题。贴一下比赛的代码,之后补题。

E题 签到

暴力字符串,找 "edgnb" 的个数

#include<bits/stdc++.h>
#define IO_FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
int main()
{
 	IO_FAST
 	string s;
 	cin >> s;
 	int cnt = 0;
 	int len = s.size() - 4;
 	for(int i = 0; i < len; i++) {
 		if(s[i] == 'e' && s[i+1] == 'd' && s[i+2] == 'g' && s[i+3] == 'n' && s[i+4] == 'b') cnt++;
 	}
 	cout << cnt << '\n';
 	return 0;
}

F题 Encoded String I

题目大意:定义一种编码方式,字符串 S 中每种字母 ch 最后一次出现的位置之后有 i 种字母,就把所有的 ch 变为第 i + 1 个字母。
给你一个长度为 n 的字符串 S,求 S 的 n 个前缀编码后字典序最大的前缀。

从后往前,把每个前缀编码,然后比较大小,n <= 1000,暴力可过
AC代码

#include<bits/stdc++.h>
#define IO_FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
typedef long long ll;
int chk[25];
char change[25];
int main()
{
 	// IO_FAST
 	int n;
 	string str, ans = "";
 	cin >> n >> str;
 	for(int j = n - 1; j >= 0; j--) {
 		string s = str.substr(0, j + 1);
 		int cnt = 0;
 		for(int i = j; i >= 0; i--) {
 			if(chk[s[i] - 'a']) s[i] = change[s[i] - 'a'];
 			else {
 				chk[s[i] - 'a'] = 1;
 				change[s[i] - 'a'] = cnt + 'a';
 				s[i] = change[s[i] - 'a'];
 				cnt++;
 			}
 		}
 		memset(chk, 0, sizeof(chk));
 		if(s > ans || ans == "") ans = s;
 	}
 	cout << ans << '\n';
 	return 0;
}

之后还开了 B 题和 J 题,都没写出来。
B 题去构造数组,看题解是用二分图染色,知识盲区。
J 题是给两个四位数密码,求前一个转到后一个密码的最小次数,相邻的数字可以一起转
题解是只有四位数从 0000 开始总共才 10000 种方案,BFS 一下
之后补完题再贴代码

总结

很多知识点都没有学习,想题时也做了不少无用功,各方面都需要提高。
这学期的算法竞赛暂告一段落了,日常还是要练习,以免手生,寒假再花时间集中学习训练,继续努力吧!

posted @ 2021-11-22 11:14  01kkkrill  阅读(288)  评论(0编辑  收藏  举报