3512【NOIP2013模拟11.5A组】游戏节目(show)
(File IO): input:show.in output:show.out
Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits
Description
有三支队伍,分别是A,B,C。有n个游戏节目,玩第i个游戏,队伍A可以得到的分数是A[i],队伍B可以得到的分数是B[i],队伍C可以得到的分数是C[i]。由于时间有限,可能不是每个节目都能玩,于是节目主持人决定要从n个游戏节目里面挑选至少k个节目出来(被选中的节目不分次序),使得队伍A成为赢家。队伍A能成为赢家的条件是队伍A的总得分要比队伍B的总得分要高,同时也要比队伍C的总得分要高。节目主持人有多少种不同的选取方案?
Input
第一行,两个整数n和k。
第二行, n个整数,分别是A[1]、A[2]、A[3]…A[n]。
第三行, n个整数,分别是B[1]、B[2]、B[3]…B[n]。
第四行, n个整数,分别是C[1]、C[2]、C[3]…C[n]。
Output
一个整数,表示不同的选取方案数量。
Sample Input
3 2
1 1 2
1 1 1
1 1 1
Sample Output
3
【样例解释】
方案一:选取节目1和节目3。
方案二:选取节目2和节目3。
方案三:选取节目1、节目2、节目3。
Data Constraint
对于40%数据,2 <= n <= 20。
对于100%数据,2 <= n <= 34, 1 <= k <= min(n,7), 1 <=A[i], B[i], C[i]<= 10^9。
n = 20 n=20 n=20有40pts的暴力分,这个就不说了。
100分做法的话,首先注意到 k k k的范围非常友好,所以正难则反一下,我们可以用总的满足条件的方案数减去选的节目少于 k k k的方案数就是答案了嘛。求选的节目少于 k k k的方案数用40pts的暴力的方法就可以了。
然后考虑求全部的方案数。接下来我们再看到 n n n,这个 n n n的范围是有它的道理的,你看它既不是很大,但是又不是小到连暴力就可以水过,这充分地体现了OI的有趣之处(怎么又开始哲学 )。
你看它除以2的话就可以暴力了,所以考虑折半搜索。
问了一下老师哪种题用折半搜索比较合适的,老师说其实不太常用,就是范围看起来像这道题这个样子的,还有就是合并答案不是很复杂的(其实我觉得这道题合并答案的部分最难啊喂),有的分成的两半还不一定用同一种算法,有的还不一定从中间分开,要看题目的一些性质。(怎么感觉跟分治很像咧),最常见的一类就是meet in middle那种(挖坑待填)。
折半搜索,每一半的复杂度为 2 n 2 2^{\frac{n}{2}} 22n(上取整还是下取整这个不重要的啦 ,实现的时候随便搞一下反正能包含所有节目就行)
下面考虑合并答案:
假设左边的一种组合节目的三个权值之和分别为 A i , B i , C i A_i,B_i,C_i Ai,Bi,Ci,左边的为 A j , B j , C j A_j,B_j,C_j Aj,Bj,Cj
然后合并的时候要保证合法,即为:
A i + A j > B i + B j A_i+A_j>B_i+B_j Ai+Aj>Bi+Bj
A i + A j > C i + C j A_i+A_j>C_i+C_j Ai+Aj>Ci+Cj
然后套路一波,我们要把下标一样的数放到一起,即为:
A i − B j > B j − A j A_i-B_j>B_j-A_j <