(step4.1.2)hdu 1969(Pie——二分查找)

本文介绍了一种通过二分查找法解决将n块馅饼平均分配给m+1个人的问题,确保每个人获得的馅饼是完整的,且尽可能最大化。文章详细解释了算法实现过程,并附带了完整的C++代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:n块馅饼分给m+1个人,每个人的馅饼必须是整块的,不能拼接,求最大的。


解题思路:

1)用总饼的体积除以总人数,得到每个人最大可以得到的V.但是每个人手中不能有两片或多片拼成的一块饼。


代码如下:

/*
 * 1969_2.cpp
 *
 *  Created on: 2013年8月14日
 *      Author: Administrator
 */


#include <stdio.h>
#include <math.h>
#include <string.h>

double V[10001];
int N,F;

//PI尽量用反余弦函数来算,否则可能精度不够
const double PI = acos(-1.0);

/**
 * 输入饼的面积,判断能否够分
 * 若以此面积分割后所得的饼的块数>=人数,则够分
 * 否则不够分
 */
bool test(double x){

	//num .用来记录三块大馅饼最终能分成多少个小馅饼
	int num = 0;
	int i;
	for( i = 1 ; i <= N ; ++i){

		//V[i]/x 。计算每块馅饼能分成多少个小馅饼.其中的int体现了"每个人手中的馅饼不能是拼接而成的"
		num +=  int(V[i]/x);
	}

	 //判断小馅饼数与朋友数的大小
	if( num >= F){
		return true;
	}else {
		return false;
	}
}

int main(){

	int t;
    scanf("%d",&t);
    while(t--){
    	memset(V,0,sizeof(V));
    	scanf("%d%d",&N,&F);

    	F = F+1;
    	int i;
    	double sum = 0;
    	for( i = 1 ; i <= N ; ++i){
    		int r;
    		scanf("%d",&r);
    		V[i] = PI*r*r;
    		sum += V[i];
    	}

    	double max = sum/F;

    	double l = 0;
    	double r = max;
    	double mid ;
    	while( r - l > 1e-6){//注意这里的精度问题
    		mid = (r+l)/2;

    		if(test(mid)){
    			l = mid;
    		}else{
    			r = mid;
    		}
    	}

    	printf("%.4lf\n",(l+r)/2);


    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值