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个候选人。
大概就是:
二分答案x(也就是能力值最低的候选人的能力值),对于每个x,考虑贪心验证此条件下是否有可行解:
对于某个球员,如果两个属性都低于x,那么不能入选任意一队。
如果恰好其中一个属性低于x,那么入选另一队。
处理完以上两种人后,现在两队都有一些人了,而且剩下的人都是能够入选任意一队的。此时如果两队的人数缺口之和小于等于剩下的人数,那么可行,否则不可行。
x如何定?= =,
@luoyin500: 二分答案啊
现在不知道x,但是可以发现x的值与可行性间的关系满足单调性(也就是x小于某一值时不可行,大于等于该值时就可行),以及可以确定x的可能的上下界(-1,10000]。
答案就是要求最小的可行的x。
那么,每一次取当前上下界(l,r]的中点mid=l+(r-l)/2,若mid可行,则得到新的上下界为(l,mid],否则得到新的上下界(mid,r]。这样不断二分迭代,直到上下界满足r-l为1,也就是区间内只有一个数了,那么答案就是r
感觉这个问题还是有点麻烦的,我不是学数学的,算法什么的不太懂,写过几年代码,我从代码角度说一下我的观点。
这个题目麻烦就就麻烦在会有重叠的部分,换句话说也就是可能没有唯一解。
比如
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中,如果你不要最优解,那就不用贪心算法,如果要,下面就需要用算法来解决。
能力不足,仅供参考