CF #173 div2 练习
2014-11-01 01:44:27
总结:前三题是技巧,D题是博弈。
A:简单模拟
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
B:其实只用简单的判断,我给写烦了(没用到a+g==1000这个条件。。。)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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 }