Day 1 模拟
1. P1088 火星人
利用STL中的next_permutation();函数求一种排列的下一种排列,循环m次即为答案。(STL大法好~~C++是世界上最好的语言~~逃
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int MAXN = 10100; 5 int n, m, s[MAXN]; 6 int main() 7 { 8 scanf("%d%d", &n, &m); 9 for(int i = 0; i <= n - 1; ++i) 10 scanf("%d", &s[i]); 11 for(int i = 1; i <= m; ++i) 12 next_permutation(s, s + n); 13 for(int i = 0; i <= n - 1; ++i) 14 printf("%d ", s[i]); 15 return 0; 16 }
View Code
2. P1015 回文数
将高精加推广到n进制即可,不再赘述,代码如下。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 const int MAXL = 110; 6 int n, ans; 7 string s1, map = "0123456789ABCDEF"; 8 bool judge(string s1) 9 { 10 string s2 = s1; 11 reverse(s2.begin(), s2.end()); 12 if(s1 == s2) return true; 13 else return false; 14 } 15 string add(string s1) 16 { 17 int a[MAXL], b[MAXL], c[MAXL], len = s1.size(), lenc = s1.size(); 18 memset(a, 0, sizeof(a)); 19 memset(b, 0, sizeof(b)); 20 21 memset(c, 0, sizeof(c)); 22 string s2 = s1, sum; 23 reverse(s2.begin(), s2.end()); 24 for(int i = 1; i <= len; ++i) 25 { 26 if(isdigit(s1[len - i])) a[i] = s1[len - i] - '0'; 27 else a[i] = s1[len - i] - 'A' + 10; 28 if(isdigit(s2[len - i])) b[i] = s2[len - i] - '0'; 29 else b[i] = s2[len - i] - 'A' + 10; 30 } 31 for(int i = 1; i <= lenc; ++i) 32 { 33 c[i] += a[i] + b[i]; 34 35 if(c[i] >= n) 36 { 37 c[i] %= n; 38 ++c[i + 1]; 39 } 40 } 41 ++lenc; 42 while(c[lenc] == 0 && lenc > 1) --lenc; 43 for(int i = lenc; i >= 1; --i) 44 sum += map[c[i]]; 45 return sum; 46 } 47 int main() 48 { 49 cin >> n >> s1; 50 for(int i = 1; i <= 30; ++i) 51 { 52 s1 = add(s1); 53 54 if(judge(s1) == true) 55 { 56 cout << "STEP=" << i << endl; 57 return 0; 58 } 59 } 60 cout << "Impossible!" << endl; 61 return 0; 62 }
View Code
3. P1604 B进制星球
与上题基本同理。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 const int MAXN = 5010; 5 int k, a[MAXN], b[MAXN], c[MAXN]; 6 char s1[MAXN], s2[MAXN]; 7 int max(int a, int b) 8 { 9 if(a >= b) return a; 10 return b; 11 } 12 int main() 13 { 14 scanf("%d%s%s", &k, s1, s2); 15 a[0] = strlen(s1); 16 b[0] = strlen(s2); 17 for(int i = 1; i <= a[0]; ++i) 18 { 19 if(s1[a[0] - i] >= '0' && s1[a[0] - i] <= '9') 20 a[i] = s1[a[0] - i] - '0'; 21 else if(s1[a[0] - i] >= 'A' && s1[a[0] - i] <= 'Z') 22 a[i] = s1[a[0] - i] - 'A' + 10; 23 } 24 for(int i = 1; i <= b[0]; ++i) 25 { 26 if(s2[b[0] - i] >= '0' && s2[b[0] - i] <= '9') 27 b[i] = s2[b[0] - i] - '0'; 28 else if(s2[b[0] - i] >= 'A' && s2[b[0] - i] <= 'Z') 29 b[i] = s2[b[0] - i] - 'A' + 10; 30 } 31 int len = max(a[0], b[0]); 32 for(int i = 1; i <= len; ++i) 33 { 34 c[i] += a[i] + b[i]; 35 if(c[i] >= k) 36 { 37 c[i] %= k; 38 ++c[i + 1]; 39 } 40 } 41 ++len; 42 while(c[len] == 0 && len > 1) --len; 43 for(int i = len; i >= 1; --i) 44 { 45 if(c[i] <= 9) 46 printf("%c", char(c[i] + '0')); 47 else if(c[i] >= 10) 48 printf("%c", char(c[i] - 10 + 'A')); 49 } 50 return 0; 51 }
View Code
4. P1402 乒乓球
字符串模拟,码农题。
1 #include <iostream> 2 using namespace std; 3 const int MAXN = 100100; 4 int now = 0, win[MAXN], w = 0, l = 0; 5 char c; 6 int main() 7 { 8 for(int i = 1; cin >> c && c != 'E'; ++i) 9 { 10 if(c == 'W') win[i] = 1; 11 else if(c == 'L') win[i] = 2; 12 } 13 for(int i = 1; ; ++i) 14 { 15 if(win[i] == 0) 16 { 17 cout << w << ":" << l << endl; 18 w = 0; 19 l = 0; 20 break; 21 } 22 else if(win[i] == 1) ++w; 23 else if(win[i] == 2) ++l; 24 if((w - l >= 2 || l - w >= 2) && (w >= 11 || l >= 11)) 25 { 26 cout << w << ":" << l << endl; 27 w = 0; 28 l = 0; 29 } 30 } 31 cout << endl; 32 for(int i = 1; ; ++i) 33 { 34 if(win[i] == 0) 35 { 36 cout << w << ":" << l << endl; 37 w = 0; 38 l = 0; 39 break; 40 } 41 else if(win[i] == 1) ++w; 42 else if(win[i] == 2) ++l; 43 if((w - l >= 2 || l - w >= 2) && (w >= 21 || l >= 21)) 44 { 45 cout << w << ":" << l << endl; 46 w = 0; 47 l = 0; 48 } 49 } 50 return 0; 51 }
View Code
By ZRQ