SRM 549 DIV2

哎,水平依旧很烂,只能做出第一道很水的题。

第一道题很简单,分析最初的位置,分成三种情况,仔细一点就没问题了,也算比较快的就提交了。

http://community.topcoder.com/stat?c=problem_solution&rm=313696&rd=15171&pm=11964&cr=23038076

第二道题比赛的时候没想清楚,比完赛之后发现了方法,其实就是二分图匹配问题,想清楚之后代码也就好写了,可惜一个小时竟然都没有想出来,要不然就是涨积分的大好时机了啊。

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <queue>
 5 #include <algorithm>
 6 #include <map>
 7 #include <math.h>
 8 #include <cstdlib>
 9 #include <cstring>
10 using namespace std;
11 
12 const int MAXN = 100;
13 class PointyWizardHats {
14 public:
15     int uN, vN; // u, v 数目,要初始化!!!
16     bool g[MAXN][MAXN]; // g[i][j] 表示xi与yj相连
17     int xM[MAXN], yM[MAXN]; // 输出量
18     bool chk[MAXN]; //  辅助量检查某轮y[v]是否被check
19     bool SearchPath(int u) {
20         int v;
21         for (v = 0; v < vN; v++)
22             if (g[u][v] && !chk[v]) {
23                 chk[v] = true;
24                 if (yM[v] == -1 || SearchPath(yM[v])) {
25                     yM[v] = u;
26                     xM[u] = v;
27                     return true;
28                 }
29             }
30         return false;
31     }
32     int MaxMatch() {
33         int u, ret = 0;
34         memset(xM, -1, sizeof(xM));
35         memset(yM, -1, sizeof(yM));
36         for (u = 0; u < uN; u++)
37             if (xM[u] == -1) {
38                 memset(chk, false, sizeof(chk));
39                 if (SearchPath(u))
40                     ret++;
41             }
42         return ret;
43     }
44 
45     bool isok(int th, int tr, int bh, int br) {
46         double b1 = double(th) / double(tr);
47         double b2 = double(bh) / double(br);
48         if (br > tr && b1 > b2) {
49             return true;
50         }
51         return false;
52     }
53 
54     int getNumHats(vector<int> topHeight, vector<int> topRadius,
55             vector<int> bottomHeight, vector<int> bottomRadius) {
56         uN = topHeight.size();
57         vN = bottomRadius.size();
58         int i, j;
59         for (i = 0; i < MAXN; i++)
60             for (j = 0; j < MAXN; j++)
61                 g[i][j] = false;
62 
63         for (i = 0; i < uN; i++)
64             for (j = 0; j < vN; j++) {
65                 if (isok(topHeight[i], topRadius[i], bottomHeight[j],
66                         bottomRadius[j])) {
67                     g[i][j] = true;
68                 }
69             }
70 
71         int res = MaxMatch();
72         return res;
73 
74     }
75 };

第三题还没有思路,继续思考............

posted on 2012-07-09 23:47  kakamilan  阅读(240)  评论(0编辑  收藏  举报

导航