UVALive 4887 Soccer 状压+模拟
2014-09-05 23:52
183 查看
题目链接:点击打开链接
题意:n个球队,m场比赛
下面n行表示n个球队的名字。
下面m场比赛表示该场比赛的2个队得分。
-1表示我们可以任意填。
这种任意填的比赛场数不超过12场。
求:
胜一场球队得2分,平得1分,败得0分。
求每个球队最好名次与最差名字。
每场只有3个状态,最多只有12场,所以状压一下,3^12个状态。
题意:n个球队,m场比赛
下面n行表示n个球队的名字。
下面m场比赛表示该场比赛的2个队得分。
-1表示我们可以任意填。
这种任意填的比赛场数不超过12场。
求:
胜一场球队得2分,平得1分,败得0分。
求每个球队最好名次与最差名字。
每场只有3个状态,最多只有12场,所以状压一下,3^12个状态。
#include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <map> #include <vector> #include <iostream> using namespace std; const int N = 20 + 2; map<string, int> id; vector<int> l, r; char s[200], ss[200]; int n; int base , tob , put , rank ; int mx , mi ; string name ; bool cmp(int x, int y) { return tob[x] > tob[y]; } void upmx(int& z, int x) { if (z == -1) z = x; else if (z < x) z = x; } void upmi(int& z, int x) { if (z == -1) z = x; else if (z > x) z = x; } void dfs(int dep) { if (dep == l.size()) { for (int i = 1; i <= n; ++i) { rank[i] = i; tob[i] = base[i]; } for (int i = 0; i < l.size(); ++i) { if (put[i] == 0) { ++ tob[l[i]]; ++ tob[r[i]]; } else if (put[i] == 1) { tob[l[i]] += 3; } else tob[r[i]] += 3; } sort(rank + 1, rank + 1 + n, cmp); int cur = 1; upmx(mx[rank[1]], 1); upmi(mi[rank[1]], 1); for (int i = 2; i <= n; ++i) { if (tob[rank[i]] != tob[rank[i - 1]]) cur = i; upmx(mx[rank[i]], cur); upmi(mi[rank[i]], cur); } } else { put[dep] = 0; dfs(dep + 1); put[dep] = 1; dfs(dep + 1); put[dep] = 2; dfs(dep + 1); } } void pu(int x) { if (x == 1) printf("1st"); else if (x == 2) { printf("2nd"); } else if (x == 3) { printf("3rd"); } else { printf("%dth", x); } } int main() { int m, a, b, x, y, len, cas = 0; while (~scanf("%d%d", &n, &m)) { if (0 == n && 0 == m) break; if (cas == 0) cas = 1; else puts(""); id.clear(); for (int i = 1; i <= n; ++i) { cin >> name[i]; id[name[i]] = i; } memset(base, 0, sizeof base); l.clear(); r.clear(); while (m -- > 0) { scanf("%s vs %s %d %d", s, ss, &a, &b); len = strlen(ss); ss[--len] = '\0'; x = id[s]; y = id[ss]; if (a == -1) { l.push_back(x); r.push_back(y); } else { if (a == b) { ++ base[x]; ++ base[y]; } else if (a > b) base[x] += 3; else if (b > a) base[y] += 3; } } memset(mx, -1, sizeof mx); memset(mi, -1, sizeof mi); dfs(0); for (int i = 1; i <= n; ++i) { printf("Team "); cout << name[i]; printf(" can finish as high as "); pu(mi[i]); printf(" place and as low as "); pu(mx[i]); puts(" place."); } } return 0; }
相关文章推荐
- UVALIVE 4887 Soccer && UVELIVE 4882
- UVALive 5111 Soccer Teams (动态规划)
- UVALive - 5052 Genome Evolution 贪心
- 例题1.12 组装电脑 Assemble UVALive - 3971 模拟或者二分
- UVALive 4119 Always an integer(差分数列+模拟)
- UVALive - 3523 Knights of the Round Table(【点双连通分量】+【二分图判定】)
- UVaLive 2965 Jurassic Remains (状态压缩)
- UVALive 6511 Term Project
- UVALive - 4256 Salesmen (简单DP)
- UVALive 6913 I Want That Cake 博弈+dp
- uva 1421 & uvalive 4253 Archery(二分)
- LA 3266 || UVALive 3266 Tian Ji -- The Horse Racing 田忌赛马(贪心)
- UVALive 7070 The E-pang Palace(2014广州赛区现场赛)
- 【UVALIVE 5713】秦始皇修路(最小瓶颈路+Kruskal)
- UVALive 3644 X-Plosives
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
- UVALive6336 HDU4450 Draw Something【水题】
- UVa 10716 - Evil Straw Warts Live
- UVALive 6255 Kingdoms --状态搜索
- UVALive - 2911 Maximum