1. 程式人生 > 其它 >2021 ICPC 瀋陽站 ( E, F題 )

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 一下
之後補完題再貼程式碼

總結

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

本文來自部落格園,作者:01kkkrill,轉載請註明原文連結:https://www.cnblogs.com/krill/p/15587709.html