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 一下
之后補完題再貼代碼

總結

很多知識點都沒有學習,想題時也做了不少無用功,各方面都需要提高。
這學期的算法競賽暫告一段落了,日常還是要練習,以免手生,寒假再花時間集中學習訓練,繼續努力吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM