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

猜你喜欢

转载自www.cnblogs.com/ZhangRunqi/p/12397254.html