首页 新闻 会员 周边 捐助

一道网易的编程题

0
悬赏园豆:50 [待解决问题]

c国需要组建一支最强的足球队,教练想先组建一支具备实力的候选队伍,然后正式队伍再从里面挑选。

现在已经确定了后卫和门将两个位置的人选,剩下的前锋和中场人选需要从N个候选人里面确定,其中前锋需要X人,中场需要Y人,每候选人可能只能打前锋和中场的某个位置,也可能同时胜任前锋和中场,且候选人打不同的位置时候具有不同的能力值。当一个候选人被选定为某个位置就不能更改,候选人在该位置的能力值就是候选人的能力值。

教练希望最后入选的所有人选中,能力值最低的候选人的能力值也尽可能高,这样才能组成最强的队伍,该值是多少?

输入描述:

第一行为一个正整数T(T<=10),表示测试数据组数。接下来有T组数据。

每组数据第一行包含三个整数N(0<N<=50000),X,Y(0<=X,Y<=10000),X,Y不会同时为0。

接下来N行,每行2个整数S0,S1(0<=S0,S1<=10000),分别表示这个候选人在前锋和中锋的能力值。

数据保证X+Y<=N,若没有满足的方案,则输出0。

测试输入:

1

5 2 2

100 0

0 99

95 95

96 0

0 97

输出:

96

 

最优方案为选择第1,2,4,5个候选人。

 

 

luoyin500的主页 luoyin500 | 初学一级 | 园豆:89
提问于:2018-04-06 17:30
< >
分享
所有回答(2)
0

大概就是:

二分答案x(也就是能力值最低的候选人的能力值),对于每个x,考虑贪心验证此条件下是否有可行解:

对于某个球员,如果两个属性都低于x,那么不能入选任意一队。

如果恰好其中一个属性低于x,那么入选另一队。

处理完以上两种人后,现在两队都有一些人了,而且剩下的人都是能够入选任意一队的。此时如果两队的人数缺口之和小于等于剩下的人数,那么可行,否则不可行。

hehe_54321 | 园豆:950 (小虾三级) | 2018-04-06 17:41

x如何定?= =,

支持(0) 反对(0) luoyin500 | 园豆:89 (初学一级) | 2018-04-06 17:56

@luoyin500: 二分答案

现在不知道x,但是可以发现x的值与可行性间的关系满足单调性(也就是x小于某一值时不可行,大于等于该值时就可行),以及可以确定x的可能的上下界(-1,10000]。

答案就是要求最小的可行的x。

那么,每一次取当前上下界(l,r]的中点mid=l+(r-l)/2,若mid可行,则得到新的上下界为(l,mid],否则得到新的上下界(mid,r]。这样不断二分迭代,直到上下界满足r-l为1,也就是区间内只有一个数了,那么答案就是r

支持(0) 反对(0) hehe_54321 | 园豆:950 (小虾三级) | 2018-04-06 18:35
0

感觉这个问题还是有点麻烦的,我不是学数学的,算法什么的不太懂,写过几年代码,我从代码角度说一下我的观点。

这个题目麻烦就就麻烦在会有重叠的部分,换句话说也就是可能没有唯一解。

比如

1

6 2 2

100 0

100 99

100 50

96 96

0 99

98 99

会发现1 2 3组可能会有x最大值,2 5 6组会有y最大值,剩下的就是看那个解更合适你的需求(这还不是极端的,极端可能会有多个解)

我谈谈我的做法,我的方法肯定不是最佳解,只是随便说说思路,我会这样做,将数组转为三围数组,也就是

100 0 1

100 99 2

100 50 3

96 96 4

0 99 5

98 99 6

首先按,1 2列倒排,然后遍历第一列,直到1列变化后>=x,并记录第三列值,本例中会记录,2 3 1

然后按,2 3列倒排,然后遍历第二列,直到2列变化后>=y, 并记录第三列值,本例中会记录,2 6 5

因为x =2 ,y =2 所以需要舍弃数组中的某些值,也就是2要么出现在x中要么出现在y中,如果你不要最优解,那就不用贪心算法,如果要,下面就需要用算法来解决。

能力不足,仅供参考

yhdino | 园豆:701 (小虾三级) | 2018-04-10 10:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册