每日一题(六)

3月27日 

 这个题目主要考的是分冶,也就是二分查找,我们根据条件来找到需要的最大的长度,在使用二分查找时,我们需要保证区间里面的数是有序的,我们定义left与right来决定需要查找的区间大小,根据题目需求,具体情况,具体做条件判断,我们写一个函数用来判断并且帮助缩小区间,定义一个bool的函数,输入值我们输入一个可能是最大的长度,对其求出来可以裁剪的数量,如果大于等于需的数量s,就返回1,否则就返回0,用来作为二分查找的判断条件,如果大于等于s,说明这个数小了(等于的情况放在一起,可以更好的处理,因为我们是需要找最大的长度),在右边的区间,我们就令left就等于mid,如果不满足,说明这个数大了,他在左边的区间里面,我们就令right等于mid,以此类推,直到right<left,但是这个题目精度要求比较高,所以就写成了right-left>1e-4,因为前面我们将等于的情况给了left,所以我们输出left就可以了,同时记得保留两位小数输出。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int a[100010];
bool pd(double x)
{
	int cnt=0;
	for(int i=0;i<n;i++)
	{
		cnt+=(a[i]/x);
	}
	return cnt>=m;
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    double mid,left=0,right=1e9;
    while(right-left>1e-4)
    {
    	mid=(left+right)/2;
    	if(pd(mid))
    	left=mid;
    	else
    	right=mid;
	}
	printf("%.2lf",left);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值