2021 ICPC 瀋陽站 ( E, F題 )
阿新 • • 發佈:2021-11-22
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