Day 1 模拟

1. P1088 火星人

利用STL中的next_permutation();函数求一种排列的下一种排列,循环m次即为答案。(STL大法好~~C++是世界上最好的语言~~逃

Day 1 模拟

 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

Day 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

Day 1 模拟

 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 乒乓球

字符串模拟,码农题。

Day 1 模拟

 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

Day 1 模拟

 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

Day 1 模拟

 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大佬

    Day 1 模拟

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/371002

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月3日 上午10:31
下一篇 2023年3月3日 上午10:32

相关推荐