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 };
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 };