Codeforces Round #222 (Div. 2) 解题报告

Problem A Playing with Dice

题意:两个人心中都想一个数字,然后掷骰子。骰子1-6问你有几种方案会靠近a想的数字几种一样近几种靠近b的?

思路:大水题一枚直接1-6枚举。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <utility>
 8 #include <queue>
 9 #include <stack>
10 #include <vector>
11 #define MP(a, b) make_pair(a, b)
12 #define PB(a) push_back(a)
13 
14 using namespace std;
15 
16 typedef long long ll;
17 typedef pair<int,int> pii;
18 
19 const int INF = 0x3f3f3f3f;
20 const double eps = 1E-6;
21 
22 int main()
23 {
24 //    freopen("in.txt", "r", stdin);
25     int a, b;
26 
27     while(scanf("%d%d", &a, &b)!=EOF){
28         int x = 0, y = 0, z = 0;
29         for(int i=1; i<=6; i++){
30             if(abs(i-a)==abs(i-b))y++;
31             else if(abs(i-a)>=abs(i-b))x++;
32             else z++;
33         }
34         cout << z << ' ' << y << ' ' << x << endl;
35     }
36     return 0;
37 }
View Code

Problem B Semifinals

题意:有一些人比赛,晋级规则是有一个k,首先两场比赛的前k名晋级或者是全部选手排名前2k的晋级。

思路:这道题我是分了两个数组存,一个是一维的一个是二维的。首先标记二维的前n/2个,再标记一位数组排好序后的前n个。最后输出矩阵即可。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <utility>
 8 #include <queue>
 9 #include <stack>
10 #include <vector>
11 #define MP(a, b) make_pair(a, b)
12 #define PB(a) push_back(a)
13 
14 using namespace std;
15 
16 typedef long long ll;
17 typedef pair<int,int> pii;
18 
19 const int INF = 0x3f3f3f3f;
20 const double eps = 1E-6;
21 const int LEN = 100011;
22 int Map[LEN][2], ans[LEN][2], ss[LEN*2];
23 
24 bool cmp(int a, int b){return a>b;}
25 
26 int main()
27 {
28 //    freopen("in.txt", "r", stdin);
29     int n;
30     while(scanf("%d", &n)!=EOF){
31         memset(ans, 0, sizeof ans);
32         for(int i=0; i<n; i++){
33             scanf("%d%d", &Map[i][0], &Map[i][1]);
34             ss[2*i] = Map[i][0];
35             ss[2*i+1] = Map[i][1];
36         }
37         sort(ss, ss+2*n);
38         for(int i=0; i<n; i++){
39             for(int j=0; j<2; j++){
40                 if(i<n/2 || Map[i][j]<=ss[n-1])ans[i][j] = 1;
41             }
42         }
43         for(int j=0; j<2; j++){
44             for(int i=0; i<n; i++){
45                 printf("%d", ans[i][j]);
46             }
47             printf("\n");
48         }
49 
50     }
51     return 0;
52 }
View Code

Problem C Maze

题意:一张图中有一个连通分支有s个点。然后现在允许你赌上k个结点,然后要是剩下的结点还在一个联通分支下。

思路:直接搜索当标记结点等于s-k个时退出(这是标记的点正好形成一个联通分支)然后剩下来的点就是需要填上的点。当然一开始需要先统计一下,图中连通分支的结点数。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <utility>
 8 #include <queue>
 9 #include <stack>
10 #include <vector>
11 #define MP(a, b) make_pair(a, b)
12 #define PB(a) push_back(a)
13 
14 using namespace std;
15 
16 typedef long long ll;
17 typedef pair<int,int> pii;
18 
19 const int INF = 0x3f3f3f3f;
20 const double eps = 1E-6;
21 const int LEN = 1010;
22 int n ,m, K, vis[LEN][LEN] ,cnt , S;
23 char Map[LEN][LEN];
24 int xx[] = {0, 0, 1,-1};
25 int yy[] = {1,-1, 0, 0};
26 typedef struct {
27     int x,y;
28 }P;
29 
30 
31 void bfs(P s){
32     queue<P> q;
33     q.push(s);
34     vis[s.x][s.y] = 1;
35     if(cnt>=S-K)return;
36     while(!q.empty()){
37         P vex = q.front(); q.pop();
38         for(int i=0; i<4; i++){
39             P nv;
40             nv.x = vex.x+xx[i];
41             nv.y = vex.y+yy[i];
42             if(nv.x>=0 && nv.x<n && nv.y>=0 && nv.y<m && Map[nv.x][nv.y]!='#' && !vis[nv.x][nv.y]){
43                 vis[nv.x][nv.y] = 1;
44                 cnt++;
45                 if(cnt>=S-K)return;
46                 q.push(nv);
47             }
48         }
49     }
50 }
51 
52 
53 int main()
54 {
55 //    freopen("in.txt", "r", stdin);
56 
57     P s;
58     while(scanf("%d%d%d", &n, &m, &K)!=EOF){
59         for(int i=0; i<n; i++){
60             scanf("%s", Map[i]);
61         }
62         S = 0;
63         for(int i=0; i<n; i++){
64             for(int j=0; j<m; j++){
65                 if(Map[i][j] == '.')S++;
66             }
67         }
68         memset(vis, 0, sizeof vis);
69         int f = 1;
70         for(int i=0; i<n; i++){
71             for(int j=0; j<m; j++){
72                 if(Map[i][j]=='.'){
73                     f = 0;
74                     s.x = i;s.y = j;
75                     cnt = 1;
76                     if(S-K>=0)bfs(s);
77                     break;
78                 }
79             }
80             if(f==0)break;
81         }
82 //        debug();
83         for(int i=0; i<n; i++){
84             for(int j=0; j<m; j++){
85                 if(vis[i][j]==0 && Map[i][j] == '.'){
86                     Map[i][j] = 'X';
87                 }
88             }
89         }
90         for(int i=0; i<n; i++){
91             for(int j=0; j<m; j++){
92                 printf("%c", Map[i][j]);
93             }
94             printf("\n");
95         }
96     }
97     return 0;
98 }
View Code

 

posted @ 2013-12-30 02:19  张小豪  阅读(225)  评论(0编辑  收藏  举报