太久沒做題就會變得很菜。
題目鏈接:https://codeforces.com/contest/1281/
A:
白給。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int t; 21 const int maxn=1010; 22 char s[maxn]; 23 24 int main() { 25 scanf("%d",&t); 26 while(t--){ 27 scanf("%s",s+1); 28 int len=strlen(s+1); 29 if (s[len]=='o') puts("FILIPINO"); 30 else if (s[len]=='u') puts("JAPANESE"); 31 else puts("KOREAN"); 32 } 33 return 0; 34 }
B:
顯然對於每一位,只能跟后面的字符交換。如果只是O(n)掃,遇到第一個s[i]>c[i]的情況才考慮替換的話是錯的。應該先把s的副本sort一遍,這樣得到的結果是s每個位置交換能得到的最小的字符。當s[i]>s_copy[i],即當前字符有優化空間時就立即考慮替換。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (minpos<<1) 15 #define rson (minpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int t; 21 string a,b; 22 23 int main() { 24 cin>>t; 25 while (t--){ 26 cin>>a>>b; 27 if (a<b){ 28 cout<<a<<'\n'; 29 continue; 30 } 31 string s=a; 32 sort(s.begin(),s.end()); 33 int flag=0; 34 for (int i=0;i<(int)a.size();i++){ 35 // current char is not at the best position 36 if (a[i]>s[i]){ 37 // it can swap with the back char only 38 for (int j=i+1;j<(int)a.size();j++){ 39 swap(a[i],a[j]); 40 if (a<b){ 41 cout<<a<<'\n'; 42 flag=1; 43 i=(int)a.size(); 44 break; 45 } 46 swap(a[i],a[j]); 47 } 48 } 49 } 50 if (!flag) puts("---"); 51 } 52 return 0; 53 }
C:
看似很數學,其實直接模擬就過了。注意當前字符串長度大於等於x時則停止延長字符串即可。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int mod = 1e9 + 7; 21 int t; 22 23 int main() { 24 ios::sync_with_stdio(false); 25 cin.tie(0); 26 27 cin >> t; 28 while (t--) { 29 int x; string s; cin >> x >> s; 30 int currLen = (int)s.size(); 31 for (int i = 0; i < x; i++) { 32 int curr = s[i] - '0'; 33 // length need to grow 34 if (currLen < x) { 35 for (int j = 1; j < curr; j++) 36 if ((int)s.size() < x) { 37 for (int l = i + 1; l < currLen; l++) 38 if ((int)s.size() < x) s += s[l]; 39 } 40 } 41 // calculate current length of string 42 int d = (currLen - i - 1 + mod) % mod; 43 currLen = ((i + 1) + (ll)d * curr) % mod; 44 } 45 cout << currLen << '\n'; 46 } 47 return 0; 48 }
D:
分類討論題。很顯然答案只能在[0,4]之間取值。枚舉每一行每一列,對於每一行,檢查其是否為全A、A在邊緣和A在內部的情況,維護答案。列同理。

1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 100; 21 int t, n, m; 22 char a[maxn][maxn]; 23 24 int main() { 25 scanf("%d", &t); 26 while (t--) { 27 int foundA = 0, foundP = 0, ans = 4; 28 scanf("%d%d", &n, &m); 29 for (int i = 1; i <= n; i++) { 30 scanf("%s", a[i] + 1); 31 for (int j = 1; j <= m; j++) 32 if (a[i][j] == 'A') foundA = 1; 33 else foundP = 1; 34 } 35 if (!foundA) { 36 puts("MORTAL"); 37 continue; 38 } 39 if (!foundP) { 40 puts("0"); 41 continue; 42 } 43 for (int i = 1; i <= n; i++) { 44 int maxx = -1, minn = 1000; 45 for (int j = 1; j <= m; j++) { 46 maxx = max(maxx, (int)a[i][j]), minn = min(minn, (int)a[i][j]); 47 if (a[i][j] == 'A') { 48 int t = 4; 49 if (i == 1 || i == n) t--; 50 if (j == 1 || j == m) t--; 51 ans = min(ans, t); 52 } 53 } 54 if (maxx == minn && maxx == 'A') { 55 if (i == 1 || i == n) ans = min(ans, 1); 56 else ans = min(ans, 2); 57 } 58 } 59 for (int j = 1; j <= m; j++) { 60 int maxx = -1, minn = 1000; 61 for (int i = 1; i <= n; i++) { 62 maxx = max(maxx, (int)a[i][j]), minn = min(minn, (int)a[i][j]); 63 } 64 if (maxx == minn && maxx == 'A') { 65 if (j == 1 || j == m) ans = min(ans, 1); 66 else ans = min(ans, 2); 67 } 68 } 69 printf("%d\n", ans); 70 } 71 return 0; 72 }
E:
待補。