TopCoder SRM 660 Div2 Problem 500 - PrivateD2party (贪心)
2015-06-06 12:27
405 查看
题意
给出一些数,表示第i个人讨厌第j个人,问一个聚会最多能进多少人。思路
贪心一下。我们先存一下每个人被哪些人讨厌,并且被讨厌几次。
可以这么想,如果让一个被除他之外的人讨厌的人第一个入场,那么后面就没人敢进去了。所以我们要让被讨厌次数最少的人先进。
每次进这样的一个人,就意味着可能一些人不能进了,我们用一个数组stop来标记一下。这时候要注意,当进一个人之后,就相当于这个人消失了,那么他讨厌的这个人(被讨厌的次数)就要减一。
用了两层for,很不优雅。可以搞到O(nlogn)。
代码
int stop[100], dislike[100], vis[100]; class PrivateD2party { public: int getsz(vector<int> a) { MS(stop, 0); MS(dislike, 0); MS(vis, 0); vector<int> G[100]; for (int i = 0; i < SZ(a); i++) if (a[i] != i) { G[a[i]].PB(i); dislike[a[i]]++; } int ans = 0, cnt = 0; while (true) { int cur_min = INF, pos; for (int i = 0; i < SZ(a); i++) { if (vis[i] || stop[i]) continue; if (dislike[i] < cur_min) { pos = i; cur_min = dislike[i]; } } ans++; vis[pos] = 1; for (int i = 0; i < SZ(G[pos]); i++) { if (!vis[G[pos][i]] && !stop[G[pos][i]]) { stop[G[pos][i]] = 1; cnt++; } } dislike[a[pos]]--; if (ans + cnt == SZ(a)) break; } return ans; } };
相关文章推荐