Topcoder SRM 655 div2

2015-04-10 01:54:56

总结:11点开的一场,看来明天汇编是上不了了 QAQ...

  好吧... 来看比赛,第一题打了一个暴力后发现是个技巧,果断改了,耗时比较多,166+分 = =!

  第二题又打了一个暴力...  不过姿势不好,fst 掉了。最后发现别人也是暴力,不过是姿势更加优美的枚举。这题靠大数据 cha 了一发 :P

 

A:简单来说就是判断一个图能否构成像国际象棋那样的图。黑白相间。

  发现把每个格子的横纵坐标相加,奇偶性一样的格子颜色须一样。

  那么我们按顺序找到第一个非 ‘?’ ,比如找到 ‘W’,判断同奇偶的格子是否都是 ‘W’ 或 ‘?’

  类似地再判断一遍 ‘B’ 即可。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=0;i<(n);++i)
17 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
18 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
19 #define MP(a,b) make_pair(a,b)
20 
21 typedef long long ll;
22 typedef pair<int,int> pii;
23 const int INF = (1 << 30) - 1;
24 
25 #line 5 "BichromeBoard.cpp"
26 
27 class BichromeBoard {
28     int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
29     public:
30     string ableToDraw(vector <string> board) {
31         int n = board.size(),m = board[0].size();
32         vector <string> &g = board;
33         bool ans = true;
34         int f = -1;
35         int px,py;
36         for(int i = 0; i < n; ++i){
37             for(int j = 0; j < m; ++j) if(g[i][j] != '?'){
38                 if(g[i][j] == 'W') f = 0;
39                 else f = 1;
40                 px = i,py = j;
41                 break;
42             }
43             if(f != -1) break;
44         }
45         if(f != -1){
46             int st = (px + py) % 2;
47             for(int i = 0; i < n; ++i){
48                 for(int j = 0; j < m; ++j) if(g[i][j] != '?'){
49                     int cur = (i + j) % 2;
50                     int id = g[i][j] == 'W' ? 0 : 1;
51                     if(cur == st && id != f){
52                         ans = false;
53                         break;
54                     }
55                     if(cur != st && id == f){
56                         ans = false;
57                         break;
58                     }
59                 }
60                 if(ans == false) break;
61             }
62         }
63         if(ans) return "Possible";
64         else return "Impossible";
65     }
66 };
View Code

 

B:给出一张纸的 W 和 H ,问能否通过折叠使得面积为 A 。

  由于 W,H 的范围:1~10^9 , 但是 A 的范围仅仅为 1~10^6

  所以可以枚举宽 w,范围为1 ~ min(A,W)

  然后贪心计算一下折叠到当前 w 和 h 需要的次数,取最小值即可。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=0;i<(n);++i)
17 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
18 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
19 #define MP(a,b) make_pair(a,b)
20 
21 typedef long long ll;
22 typedef pair<int,int> pii;
23 const int INF = (1 << 30) - 1;
24 
25 #line 5 "FoldingPaper2.cpp"
26 
27 class FoldingPaper2 {
28     int ans;
29     public:
30     int solve(int W, int H, int A) {
31         ans = INF;
32         int top = min(W,A);
33         for(int i = 1; i <= top; ++i) if(A % i == 0){
34             int tw = i;
35             int th = A / i;
36             int w = W;
37             int h = H;
38             if(th > H) continue;
39             int cnt = 0;
40             while(w - w / 2 > tw){
41                 w -= w / 2;
42                 cnt++;
43             }
44             if(w > tw) cnt++;
45             while(h - h / 2 > th){
46                 h -= h / 2;
47                 cnt++;
48             }
49             if(h > th) cnt++;
50             ans = min(ans,cnt);
51         }
52         if(ans >= INF) return -1;
53         return ans;
54     }
55 };
View Code

 

 

  

 

posted @ 2015-04-10 02:27  Naturain  阅读(128)  评论(0编辑  收藏  举报