这场比以往的难点额= =
A题就是 每次删掉2-N-1这(N-2)位置上的一个元素 然后观察 max(a[i]-a[i-1])。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int a[110]; 6 7 int main() 8 { 9 int n , ans , sum; 10 sum = 11111111; 11 ans = 0; 12 cin >> n; 13 cin >> a[1]; 14 for( int i = 2 ; i<=n ; i++ ) 15 { 16 cin >> a[i]; 17 ans = max( ans , a[i]-a[i-1] ); 18 } 19 for( int i = 2 ; i<=n-1 ; i++ ) 20 { 21 sum = min( sum , a[i+1] - a[i-1] ); 22 } 23 cout << max(sum,ans) << endl; 24 return 0; 25 }
B题 add操作最多执行10次 每一次操作完成之后 再对整个字符串进行 循环移位
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 string ans , str; 6 7 void solve( ) 8 { 9 string s , t; 10 char ch; 11 int len = str.length(); 12 int temp; 13 for( int T = 1 ; T<=10 ; T++ ) 14 { 15 s = ""; 16 for( int i = 0 ; i<len ; i++ ) 17 { 18 temp = (str[i]-'0'+T)%10;//char转int 19 ch = temp + '0';//int转char 20 s += ch; 21 } 22 if( s<ans ) 23 ans = s; 24 for( int j = 1 ; j<len ; j++ ) 25 { 26 t = ""; 27 t.append(s,j,len-j); 28 t.append(s,0,j); 29 if( t<ans ) 30 ans = t; 31 } 32 } 33 } 34 35 int main() 36 { 37 int n; 38 cin >> n; 39 cin >> str; 40 ans = str; 41 solve( ); 42 cout << ans << endl; 43 }
C题 每次只能删除一列上的所有元素 字典序的排列是对行进行要求的 所以暴力遍历过去就好 注意标记
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int n , m , cnt; 6 const int size = 110; 7 char str[size][size]; 8 bool can[size]; 9 10 void solve() 11 { 12 bool flag; 13 cnt = 0; 14 memset( can , false , sizeof(can) ); 15 for( int i = 0 ; i<m ; i++ ) 16 { 17 flag = true; 18 for( int j = 0 ; j<n-1 ; j++ ) 19 { 20 if( !can[j] && str[j][i] > str[j+1][i] ) 21 { 22 ++ cnt; 23 flag = false; 24 break; 25 } 26 } 27 if( flag ) 28 { 29 for( int j = 0 ; j<n-1 ; j++ ) 30 { 31 if( str[j][i] < str[j+1][i] ) 32 { 33 can[j] = true; 34 } 35 } 36 } 37 } 38 } 39 40 int main() 41 { 42 cin >> n >> m; 43 for( int i = 0 ; i<n ; i++ ) 44 { 45 cin >> str[i]; 46 } 47 solve(); 48 cout << cnt << endl; 49 return 0; 50 }
D题 porker说是个大模拟 我不会= =
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 class data { 7 public: 8 int s, t; 9 bool operator<(const data& p) const { 10 if (s < p.s) return true; 11 else if (s == p.s && t < p.t) return true; 12 else return false; 13 } 14 }; 15 16 int sum[2][100100]; 17 data ans[100100]; 18 int counts; 19 20 int main() { 21 int n; 22 cin.sync_with_stdio(false); 23 cin >> n; 24 sum[0][0] = sum[0][1] = 0; 25 for (int i = 1; i <= n; i++) { 26 int d; 27 cin >> d; 28 d--; 29 sum[0][i] = sum[0][i - 1]; 30 sum[1][i] = sum[1][i - 1]; 31 sum[d][i]++; 32 } 33 counts = 0; 34 int maximum = max(sum[0][n], sum[1][n]); 35 for (int i = 1; i <= maximum; i++) { 36 int sets[2] = { 0, 0 }; 37 int index = 0; 38 int interval = i * 2; 39 bool flag = true; 40 int lastwin = -1; 41 while (index < n) { 42 int nextindex = index + interval; 43 int maxindex = index + interval; 44 if (maxindex > n + 1) { 45 maxindex = n + 1; 46 } 47 int first_index = lower_bound(sum[0] + index + 1, sum[0] + maxindex, sum[0][index] + i) - sum[0]; 48 int second_index = lower_bound(sum[1] + index + 1, sum[1] + maxindex, sum[1][index] + i) - sum[1]; 49 if (first_index < second_index) { 50 sets[0]++; 51 lastwin = 0; 52 } 53 else if (second_index < first_index) { 54 sets[1]++; 55 lastwin = 1; 56 } 57 else { 58 flag = false; 59 } 60 index = min(first_index, second_index); 61 } 62 if (!flag) continue; 63 if (sets[0] > sets[1] && lastwin == 0 || sets[0] < sets[1] && lastwin == 1) { 64 ans[counts].s = max(sets[0], sets[1]); 65 ans[counts].t = i; 66 counts++; 67 } 68 } 69 sort(ans, ans + counts); 70 cout << counts << endl; 71 for (int i = 0; i < counts; i++) { 72 cout << ans[i].s << " " << ans[i].t << endl; 73 } 74 // system("pause"); 75 }