书的复制 题解

本文介绍了一道涉及二分查找的算法题目,讨论了如何确定二分范围和实现二分函数,以及在解决过程中对于所有人都必须抄书这一条件的分析。通过二分查找确定在限制时间内是否能完成抄书任务,并给出了解题代码。
摘要由CSDN通过智能技术生成

题目传送门

第一道独立做出来的绿题祭(虽然花了我将近一个小时)

这是一道二分题目

1.为了方便:

因为这道题没有明确的规定抄书时间(反正不影响结果),所以我们不妨假设一个人抄一页需要1分钟。

2.确定二分范围

确定一下二分的范围:

最优情况:每个人都只抄一本,需要的时间为页数最大的那一本所需时间。

最坏情况:一个人要把所有书抄完,需要的时间为所有书加在一起的时间。

所以二分的范围就是从最大值到和。

3.核心代码

然后二分函数开始验证,注意验证的是当只给那么多时间的时候这些人可不可以完成抄写任务。二分的地方很简单,主要的部分其实是输出答案那一部分和 c h e c k check check函数。

首先先来看输出答案那一部分。

注意题目中的一句话:

如果有多解,则尽可能让前面的人抄写少的页数。

定义 l l l为需要的最小时间(也就是二分出来的答案)。

因为要求让前面的人抄得尽量少,意思就是说让后面的人抄得尽量多(这个点一定要倒着想,如果是从前到后的话需要搜索,这样会TLE)。那么就写一个循环,只要这个人现在抄的时间不超过 l l l,就让他一直抄,直到再加上一个就会超过为止,这样就可以保证后面的人抄得最多。

打一个有注释的代码(输出部分):

int flag=n,c=0;//flag代表目前拿到的书的编号,c代表现在这个人抄的时间
for(int i=k;i>=1;i--){
   //枚举每一个人,要倒着枚举
	while(c+a[flag]<=l&&flag){
   //可以继续抄且有书可抄
		c+=a[flag];//这个人抄的时间增加
		flag--;//枚举下一本书
	}
	s[i]=flag+1;//这个人抄完了,存一下开始的编号
	c=0;//清空时间
}
for(int i=1;i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值