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
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进制星球
与上题基本同理。高精 * 2
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
5. P1255 数楼梯
递推,第k阶的方法=第k-1阶+第k-2阶,其中k的数量比较大,需用高精。高精 * 3
1 #include <cstdio> 2 using namespace std; 3 const int MAXL = 5010, MAXN = 5100; 4 int n, f[MAXN][MAXL]; 5 int max(int a, int b) 6 { 7 if(a >= b) return a; 8 return b; 9 } 10 void add(int k) 11 { 12 int len = max(f[k - 1][0], f[k - 2][0]); 13 for(int i = 1; i <= len; ++i) 14 { 15 f[k][i] += f[k - 1][i] + f[k - 2][i]; 16 if(f[k][i] >= 10) 17 { 18 f[k][i] %= 10; 19 ++f[k][i + 1]; 20 } 21 } 22 ++len; 23 while(f[k][len] == 0 && len > 1) --len; 24 f[k][0] = len; 25 return ; 26 } 27 int main() 28 { 29 f[0][0] = 0; 30 f[0][1] = 0; 31 f[1][0] = 1; 32 f[1][1] = 1; 33 f[2][0] = 1; 34 f[2][1] = 2; 35 scanf("%d", &n); 36 if(n == 0 || n == 1 || n == 2) 37 { 38 printf("%dn", f[n][1]); 39 return 0; 40 } 41 for(int i = 3; i <= n; ++i) 42 add(i); 43 for(int i = f[n][0]; i >= 1; --i) 44 printf("%d", f[n][i]); 45 printf("n"); 46 return 0; 47 }
View Code
6. P1192 台阶问题
和上一题差不多,只是每次上迈的阶数从2变为n,另外本题不用高精,答案%100003
1 #include <cstdio> 2 using namespace std; 3 const int MAXN = 100100; 4 int n, k; 5 long long f[MAXN]; 6 int min(int a, int b) 7 { 8 if(a <= b) return a; 9 return b; 10 } 11 int main() 12 { 13 scanf("%d%d", &n, &k); 14 f[0] = 1; 15 f[1] = 1; 16 for(int i = 2; i <= n; ++i) 17 for(int j = min(i, k); j >= 1; --j) 18 { 19 f[i] += f[i - j]; 20 if(f[i] >= 100003) f[i] %= 100003; 21 } 22 printf("%lldn", f[n]); 23 return 0; 24 }
View Code
By ZRQ
原文链接: https://www.cnblogs.com/ZhangRunqi/p/12397254.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/371002
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!