太久没做题就会变得很菜。
题目链接:https://codeforces.com/contest/1281/
A:
白给。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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],即当前字符有优化空间时就立即考虑替换。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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时则停止延长字符串即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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在内部的情况,维护答案。列同理。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }