sicily 2015 A New Year Gift

二分答案

题意:
有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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值