sicily 2015 A New Year Gift

来源:互联网 发布:商城软件开发 编辑:程序博客网 时间:2024/05/17 23:31
二分答案

题意:
有n种珍珠,每种珍珠i有ai颗.
一条链子由m颗不同种的珍珠组成.
给出n,m,数组a.问最多能合成多少条链子

数据范围:
n<=1000,ai<=2000,m<=100

思路:

暴力的方法也不简单啊.这里的珍珠优先度是先用数量最多的m颗珍珠,而且合成一条链子之后要重新选择最多的m颗,因此暴力的复杂度是O(mk),k是能合成的链子数.显然这链子数要到几十w不是问题,加上m大一点,就超时了

正确的做法是二分答案,而且二分判定感觉是一个非常经典的东西.我们原来的问题是m颗珍珠1条链子,问最多多少条链子,现在问题变成我要合成k条链子,问最多每条链子有几颗.显然,如果最多颗数>m,那就返回true了

原问题有一个关键的地方就是每条链不能有同种珍珠,因此我们不能一次把一种珍珠用完.而在二分判定里,由于问题变成了要合成k条链子,因此我们可以把同种珍珠往每条链子里塞珍珠.若果一种珍珠的数量ai>k,那么这种珍珠就只有k颗能用上,不然就会在某条链子上有重复的珍珠了.而若果ai<k,那么我们直接用完ai颗.注意这里的ai颗并不一定填在所有链子的同一个位置,你当它是按照蛇形来填珍珠就好了.

求出一个用了的珍珠数sum,如果sum>=k*m,那么说明填k条链子,出来的链子长度比m要大,ok!然后main函数就是不断二分这个链子数

总结:二分答案,二分判断当前合成k条链子的链子最大长度是否>=m


0 0