CF #173 div2 练习

2014-11-01 01:44:27

总结:前三题是技巧,D题是博弈。

A:简单模拟

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Fri 31 Oct 2014 10:20:48 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n;
28 char s[10];
29 
30 int main(){
31     int x = 0,flag;
32     scanf("%d",&n);
33     for(int i = 1; i <= n; ++i){
34         scanf("%s",s);
35         for(int i = 0; i < 3; ++i){
36             if(s[i] == '+') flag = 1;
37             if(s[i] == '-') flag = -1;
38         }
39         x += flag;
40     }
41     printf("%d\n",x);
42     return 0;
43 }
View Code

B:其实只用简单的判断,我给写烦了(没用到a+g==1000这个条件。。。)

 1 /*************************************************************************
 2     > File Name: b.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Fri 31 Oct 2014 11:27:25 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n;
28 int sa,sg;
29 int a[1000010],g[1000010];
30 char ans[1000010];
31 
32 int main(){
33     sa = sg = 0;
34     scanf("%d",&n);
35     for(int i = 1; i <= n; ++i)
36         scanf("%d%d",&a[i],&g[i]);
37     int flag = 0;
38     for(int i = 1; i <= n; ++i){
39         if(abs(sa + a[i] - sg) <= 500){
40             sa += a[i];
41             ans[i] = 'A';
42         }
43         else{
44             sg += g[i];
45             ans[i] = 'G';
46         }
47     }
48     if(abs(sa - sg) <= 500) printf("%s\n",ans + 1);
49     else{
50         sa = sg = 0;
51         for(int i = 1; i <= n; ++i){
52             if(abs(sg + g[i] - sa) <= 500){
53                 sg += g[i];
54                 ans[i] = 'G';
55             }
56             else{
57                 sa += a[i];
58                 ans[i] = 'A';
59             }
60         }
61         if(abs(sa - sg) <= 500) printf("%s\n",ans + 1);
62         else printf("-1\n");
63     }
64     return 0;
65 }
View Code

C:发现只要string1中有1就能组合出任意样式,如果发现string1中或者string2中只有1个没有1那么不行。

 1 /*************************************************************************
 2     > File Name: c.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Fri 31 Oct 2014 11:47:56 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 char s1[1000010];
28 char s2[1000010];
29 
30 int main(){
31     scanf("%s%s",s1,s2);
32     if(strlen(s1) != strlen(s2))
33         printf("NO\n");
34     else{
35         int f1 = 0,f2 = 0;
36         for(int i = 0; s1[i]; ++i) if(s1[i] == '1')
37         {    f1 = 1; break;}
38         for(int i = 0; s2[i]; ++i) if(s2[i] == '1')
39         {    f2 = 1; break;}
40         if(f1 + f2 == 1) printf("NO\n");
41         else printf("YES\n");
42     }
43     return 0;
44 }

D:简单博弈,暴力找必败/必胜态也可。赛后AC

公式解法:

 1 /*************************************************************************
 2     > File Name: d.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sat 01 Nov 2014 12:31:14 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 char s1[10] = "BitLGM";
28 char s2[10] = "BitAryo";
29 int n,a[5];
30 
31 int main(){
32     scanf("%d",&n);
33     for(int i = 1; i <= n; ++i) scanf("%d",&a[i]);
34     if(n == 1){
35         if(a[1])    printf("%s\n",s1);
36         else    printf("%s\n",s2);
37     }
38     else if(n == 2){
39         if(a[1] > a[2]) swap(a[1],a[2]);
40         int k = a[2] - a[1];
41         if((int)(k * (1.0 + sqrt(5.0)) / 2.0) == a[1])
42             printf("%s\n",s2);
43         else
44             printf("%s\n",s1);
45     }
46     else{
47         if(a[1] ^ a[2] ^ a[3]) printf("%s\n",s1);
48         else printf("%s\n",s2);
49     }
50     return 0;
51 }

暴力解法:用的方法基本就是:如果当前状态为必败态,那么其所有后继状态均为必胜态。

 1 /*************************************************************************
 2     > File Name: d.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sat 01 Nov 2014 01:00:12 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n,a[5];
28 int st[305][305];
29 char s1[10] = "BitLGM";
30 char s2[10] = "BitAryo";
31 
32 int main(){
33     scanf("%d",&n);
34     for(int i = 1; i <= n; ++i) scanf("%d",a + i);
35     if(n == 1){
36         if(a[1]) printf("%s\n",s1);
37         else printf("%s\n",s2);
38     }
39     else if(n == 2){
40         for(int i = 0; i <= 300; ++i)
41         for(int j = 0; j <= 300; ++j)
42         for(int k = 1; k <= 300; ++k){
43             if((i >= k && !st[i - k][j]) || (j >= k && !st[i][j - k]) ||
44                         (i >= k && j >= k && !st[i - k][j - k])){
45                 st[i][j] = 1;
46             }
47         }
48         if(st[a[1]][a[2]]) printf("%s\n",s1);
49         else    printf("%s\n",s2);
50     }
51     else{
52         if(a[1] ^ a[2] ^ a[3]) printf("%s\n",s1);
53         else printf("%s\n",s2);
54     }
55     return 0;
56 }

 

posted @ 2014-11-01 01:55  Naturain  阅读(124)  评论(0编辑  收藏  举报