由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道算法题
相关主题
Amazon telephone interview问个关于set的题
问一个cracking code interview上的问题啊求推荐学习recursive 算法的资料
请教一下subset I 输出子集顺序问题问一道算法题
Facebook Phone Inteview + 流程请教这个题咋做?
请教最优算法:最多装满水的桶?问一道题(1)
partition array problemsubset
求3题思路问道老题
DP感受 (高手请绕行)请教一个题目
相关话题的讨论汇总
话题: 认识话题: 个人话题: party话题: 参加话题: 去掉
进入JobHunting版参与讨论
1 (共1页)
a********x
发帖数: 1502
1
某人要开party,总共有n个人可以选择邀请。举办者知道m对人的两两认识关系。
他想让每个参加party的人认识的参加party的人数目大于或者等于5;同时每个参加
party的人在party上的陌生人数目也大于或等于5.
问如何选取最大的subset of n 人来参加party。
我能想到O(n^2)的算法。不知道O(n + m)如何解决。
g****y
发帖数: 240
2
说说你的解法?我的解法是,对于每一个人,如果他认识的人数大于n-5或者小于5,就
把他从list中删除,同时更新他认识的人的list,更新总人数n。然后再重头开始扫,
做相同的操作。直到list没有变化为止。感觉复杂度挺高的。
a********x
发帖数: 1502
3
和你的思路差不多吧。我觉得应该有一些update status的trick能降低复杂度

【在 g****y 的大作中提到】
: 说说你的解法?我的解法是,对于每一个人,如果他认识的人数大于n-5或者小于5,就
: 把他从list中删除,同时更新他认识的人的list,更新总人数n。然后再重头开始扫,
: 做相同的操作。直到list没有变化为止。感觉复杂度挺高的。

C***U
发帖数: 2406
4
不知道题目的意思理解对不对。
是不是有n个人,然后举办的人知道所有相互认识关系。也就是m对人。

【在 a********x 的大作中提到】
: 某人要开party,总共有n个人可以选择邀请。举办者知道m对人的两两认识关系。
: 他想让每个参加party的人认识的参加party的人数目大于或者等于5;同时每个参加
: party的人在party上的陌生人数目也大于或等于5.
: 问如何选取最大的subset of n 人来参加party。
: 我能想到O(n^2)的算法。不知道O(n + m)如何解决。

a********x
发帖数: 1502
5
en

【在 C***U 的大作中提到】
: 不知道题目的意思理解对不对。
: 是不是有n个人,然后举办的人知道所有相互认识关系。也就是m对人。

g****y
发帖数: 240
6
展开说说?

【在 C***U 的大作中提到】
: 不知道题目的意思理解对不对。
: 是不是有n个人,然后举办的人知道所有相互认识关系。也就是m对人。

C***U
发帖数: 2406
7
你这样做不一定最优啊

【在 g****y 的大作中提到】
: 说说你的解法?我的解法是,对于每一个人,如果他认识的人数大于n-5或者小于5,就
: 把他从list中删除,同时更新他认识的人的list,更新总人数n。然后再重头开始扫,
: 做相同的操作。直到list没有变化为止。感觉复杂度挺高的。

C***U
发帖数: 2406
8
我觉得我之前想错了

【在 g****y 的大作中提到】
: 展开说说?
g****y
发帖数: 240
9
我没说最优啊,这只是我能想到的方法。。。。

【在 C***U 的大作中提到】
: 你这样做不一定最优啊
d*****y
发帖数: 1365
10
我觉得可以证明是最优的。

【在 C***U 的大作中提到】
: 你这样做不一定最优啊
相关主题
partition array problem问个关于set的题
求3题思路求推荐学习recursive 算法的资料
DP感受 (高手请绕行)问一道算法题
进入JobHunting版参与讨论
C***U
发帖数: 2406
11
给你个例子
给10组5个点的complete graph。也就是说每个组5个人。然后这5个人相互认识。这样
10个组。
然后有单独一个人,他和其他所有人认识。

【在 d*****y 的大作中提到】
: 我觉得可以证明是最优的。
c********t
发帖数: 5706
12
建一个map, key是认识人数,value是人,就是认识i个人的所有人在一个value
当从list删除这个人的时候,更新他认识的人的list,如果他认识的人变的<5,
recursion 删除这个人,他不认识的人如果是认识总数=n-5的,从map中找到他们
recursion 删除,总人数n--。应该是n+m的复杂度吧

【在 g****y 的大作中提到】
: 说说你的解法?我的解法是,对于每一个人,如果他认识的人数大于n-5或者小于5,就
: 把他从list中删除,同时更新他认识的人的list,更新总人数n。然后再重头开始扫,
: 做相同的操作。直到list没有变化为止。感觉复杂度挺高的。

C***U
发帖数: 2406
13
你开始怎么选的人?

【在 c********t 的大作中提到】
: 建一个map, key是认识人数,value是人,就是认识i个人的所有人在一个value
: 当从list删除这个人的时候,更新他认识的人的list,如果他认识的人变的<5,
: recursion 删除这个人,他不认识的人如果是认识总数=n-5的,从map中找到他们
: recursion 删除,总人数n--。应该是n+m的复杂度吧

d*****y
发帖数: 1365
14
OK,初始状态,一共51个人,其中有50个人,每个人和6个人认识,另外一个人,认识
其余50个人。
第一步就是把那个人删掉。
剩下的50个人,没法删除任一个,就是最优解

【在 C***U 的大作中提到】
: 给你个例子
: 给10组5个点的complete graph。也就是说每个组5个人。然后这5个人相互认识。这样
: 10个组。
: 然后有单独一个人,他和其他所有人认识。

f*****e
发帖数: 2992
15
要有数学证明才行,否则只能是猜想。

【在 d*****y 的大作中提到】
: OK,初始状态,一共51个人,其中有50个人,每个人和6个人认识,另外一个人,认识
: 其余50个人。
: 第一步就是把那个人删掉。
: 剩下的50个人,没法删除任一个,就是最优解

g****y
发帖数: 240
16
哦,你说不优的意思是说解答不对?我还以为你说效率不好呢。你这个例子很好解决啊
。第一轮去掉那个认识所有人的。然后剩下的所有人都符合要求了,直接返回了。

【在 C***U 的大作中提到】
: 给你个例子
: 给10组5个点的complete graph。也就是说每个组5个人。然后这5个人相互认识。这样
: 10个组。
: 然后有单独一个人,他和其他所有人认识。

y****e
发帖数: 20
17
这里问题的本质是,你如何知道第一轮先去掉这个人而不是其他人?简单来说,当存在
两个人都不合格而且认识人数一样的时候(比如有两个人认识所有人),如何选择该先
删谁?

【在 g****y 的大作中提到】
: 哦,你说不优的意思是说解答不对?我还以为你说效率不好呢。你这个例子很好解决啊
: 。第一轮去掉那个认识所有人的。然后剩下的所有人都符合要求了,直接返回了。

g****y
发帖数: 240
18
都去掉。。。。。。

【在 y****e 的大作中提到】
: 这里问题的本质是,你如何知道第一轮先去掉这个人而不是其他人?简单来说,当存在
: 两个人都不合格而且认识人数一样的时候(比如有两个人认识所有人),如何选择该先
: 删谁?

g****y
发帖数: 240
19
去掉的顺序无关。

【在 y****e 的大作中提到】
: 这里问题的本质是,你如何知道第一轮先去掉这个人而不是其他人?简单来说,当存在
: 两个人都不合格而且认识人数一样的时候(比如有两个人认识所有人),如何选择该先
: 删谁?

C***U
发帖数: 2406
20
你不能拿特殊的然后说能解决。那我给个别的例子呢?

【在 g****y 的大作中提到】
: 哦,你说不优的意思是说解答不对?我还以为你说效率不好呢。你这个例子很好解决啊
: 。第一轮去掉那个认识所有人的。然后剩下的所有人都符合要求了,直接返回了。

相关主题
这个题咋做?问道老题
问一道题(1)请教一个题目
subsetSubset of size m Problem
进入JobHunting版参与讨论
y****e
发帖数: 20
21
当然有关啊,去掉一个点会改变剩下节点的度,比如A,B都不合格,并且度一样(不是
认识所有人),去掉A点会产生一个原本认识5个人而变成只认识4个人点,但去掉B点则
不会出现,这种情况是很好构造的。

【在 g****y 的大作中提到】
: 去掉的顺序无关。
g****y
发帖数: 240
22
但是A B早晚要去掉,不合格的早晚不合格,跟你去掉那个没关。既然这么好构造,你
构造一个反例来说明removal order matters

【在 y****e 的大作中提到】
: 当然有关啊,去掉一个点会改变剩下节点的度,比如A,B都不合格,并且度一样(不是
: 认识所有人),去掉A点会产生一个原本认识5个人而变成只认识4个人点,但去掉B点则
: 不会出现,这种情况是很好构造的。

g****y
发帖数: 240
23
我没有用特例,是你自己说给了反例。。。。。

【在 C***U 的大作中提到】
: 你不能拿特殊的然后说能解决。那我给个别的例子呢?
C***U
发帖数: 2406
24
而且我的例子 你的解答不对。。。
应该是去掉一个组
然后把剩下9个组和那个人加进来
因为如果把那个所有人都认识的人去掉
别的人只认识4个人 那就是所有人都不能参加了!

【在 g****y 的大作中提到】
: 哦,你说不优的意思是说解答不对?我还以为你说效率不好呢。你这个例子很好解决啊
: 。第一轮去掉那个认识所有人的。然后剩下的所有人都符合要求了,直接返回了。

C***U
发帖数: 2406
25
你的解答是不对的
我的那个例子 应该是46个人是最佳的
而不是50个人。

【在 g****y 的大作中提到】
: 我没有用特例,是你自己说给了反例。。。。。
g****y
发帖数: 240
26
不知道你在说什么,为什么要去掉一个组?你不是说一个组五个人,然后相互认识吗?

【在 C***U 的大作中提到】
: 你的解答是不对的
: 我的那个例子 应该是46个人是最佳的
: 而不是50个人。

C***U
发帖数: 2406
27
对啊
每个人必须认识5个人才能去聚会
一个组5个人,那么一个人只认识4个人!

【在 g****y 的大作中提到】
: 不知道你在说什么,为什么要去掉一个组?你不是说一个组五个人,然后相互认识吗?
C***U
发帖数: 2406
28
原题要求:
他想让每个参加party的人认识的参加party的人数目大于或者等于5;同时每个参加
party的人在party上的陌生人数目也大于或等于5.

【在 g****y 的大作中提到】
: 不知道你在说什么,为什么要去掉一个组?你不是说一个组五个人,然后相互认识吗?
g****y
发帖数: 240
29
你想说明什么?我投降了…

【在 C***U 的大作中提到】
: 原题要求:
: 他想让每个参加party的人认识的参加party的人数目大于或者等于5;同时每个参加
: party的人在party上的陌生人数目也大于或等于5.

C***U
发帖数: 2406
30

我想说明你给的解答不对啊
那个所有人都认识的人应该参加。。。。
就这么简单啊。。。。
你说的是让所有人都认识的不参加 其余的人都参加
这个解答不符合原题要求 因为剩余的人只认识4个人了
我说的答案是应该让所有人都认识的那个人参加 然后10组里面选9组参加
总共46个人才是正确答案

【在 g****y 的大作中提到】
: 你想说明什么?我投降了…
相关主题
请教leetcode Subsets II问一个cracking code interview上的问题啊
问一到题目请教一下subset I 输出子集顺序问题
Amazon telephone interviewFacebook Phone Inteview + 流程请教
进入JobHunting版参与讨论
C***U
发帖数: 2406
31
大牛
这个是你给的解答
发信人: gnahzy (hello), 信区: JobHunting
标 题: Re: 问一道算法题
发信站: BBS 未名空间站 (Thu Oct 4 16:30:52 2012, 美东)
哦,你说不优的意思是说解答不对?我还以为你说效率不好呢。你这个例子很好解决啊
。第一轮去掉那个认识所有人的。然后剩下的所有人都符合要求了,直接返回了。
如果不是我理解错你的意思了的话 你给的解答是错误的。。。。。

【在 g****y 的大作中提到】
: 你想说明什么?我投降了…
g****y
发帖数: 240
32
靠,是我不好。我以为一个小组5个人,每个人就认识5个人呢。但是我的算法没问题。
正确答案是没有人符合要求。你那个46个人不对。因为有一个人认识晚会上的所有人。

【在 C***U 的大作中提到】
: 晕
: 我想说明你给的解答不对啊
: 那个所有人都认识的人应该参加。。。。
: 就这么简单啊。。。。
: 你说的是让所有人都认识的不参加 其余的人都参加
: 这个解答不符合原题要求 因为剩余的人只认识4个人了
: 我说的答案是应该让所有人都认识的那个人参加 然后10组里面选9组参加
: 总共46个人才是正确答案

C***U
发帖数: 2406
33
好吧。。。我也理解错题意了。。。
我以为是认识的人要少于n-5
不是n-5
是party上的人数-5
才看清楚

【在 g****y 的大作中提到】
: 靠,是我不好。我以为一个小组5个人,每个人就认识5个人呢。但是我的算法没问题。
: 正确答案是没有人符合要求。你那个46个人不对。因为有一个人认识晚会上的所有人。

D**f
发帖数: 439
34
我的想法是这样的:
先扫描全部人,排除所有认识人数小于5的(可以证明包括他们的解是错误的)
再扫描剩下的人,(其实可以合并到第一趟扫描里面)
每扫描一个人,记录当前扫描到的人数,记为X,当前认识人最多的那个人认识Y个人,
只要扫描到符合如下condition的节点就可以返回了:
X>Y+5, 如果扫描完了还不符合,就是没有。
可以证明有返回结果肯定是对的,但是没找到是不是就一定没有,还得证明一下。
C***U
发帖数: 2406
35
题目再看一下。我相信删除节点的办法是对的。
1 (共1页)
进入JobHunting版参与讨论
相关主题
请教一个题目请教最优算法:最多装满水的桶?
Subset of size m Problempartition array problem
请教leetcode Subsets II求3题思路
问一到题目DP感受 (高手请绕行)
Amazon telephone interview问个关于set的题
问一个cracking code interview上的问题啊求推荐学习recursive 算法的资料
请教一下subset I 输出子集顺序问题问一道算法题
Facebook Phone Inteview + 流程请教这个题咋做?
相关话题的讨论汇总
话题: 认识话题: 个人话题: party话题: 参加话题: 去掉