您的位置:首页 > 运维架构

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm