poj3122 OpenJudge008 Pie派(二分查找)

这篇博客探讨了解决一个有趣的数学问题——如何最大化分配派给一定数量人的面积,通过二分查找算法寻找符合条件的最大面积值。博主首先介绍了问题背景,然后详细解释了二分查找的思路,并提供了C++实现代码,包括关键函数`maxPai`和辅助函数`changepai`。代码中,博主将半径转换为面积以简化问题,并通过不断调整面积值来找到满足条件的最大值。

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

点击查看poj原题

解题思路

可以利用二分查找的思想,假设一个面积值进行判断,如果成立则增大此面积再进行判断,不成立则减小面积,直到找到能成立的最大面积值输出。详细过程讲解看代码段。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const double pi=3.141592653589793;
const double EPS=1e-6;

int maxPai(double mid); //用于计算最大的派 
void changepai();	//将输入的半径 r 改为 r^2

int n,f;
double pai[10000];

int main()
{
	double max;
	cin>>n>>f;
	for(int i=0;i<n;i++)
	{
		cin>>pai[i];
	}
	changepai();
	sort(pai,pai+n);
	double l=0,r=pai[n-1],mid;	//因为将数组排序,最大可以取的半径为最后一个 
	while(fabs(r-l)>EPS){
		mid=l+(r-l)/2;
		if(maxPai(mid)){	//成立时继续查找是否有更大的值 
			l=mid;	
		} 
		else r=mid;	//不成立减小面积值 
	}
	printf("%.3f",mid*pi);

}

int maxPai(double mid)
{
	double paimax[10000]; 
	memcpy(paimax,pai,sizeof(pai));	//将数组pai复制到paimax中 
	int peple=0;
	for(int i=n-1;i>=0;i--)
	{
		
		while(paimax[i]>=mid)	//该饼在此面积值下最多能给几个人分 
		{
			paimax[i]-=mid;
			peple++;
		}
		if(peple>=f+1) return 1;	//当peple大于等于总人数时代表此mid面积值成立 
	}
	return 0;	//如果出了for循环则说明peple值始终没有大于总人数也就是此面积值太大了 
}

void changepai()
{
	for(int i=0;i<n;i++)
	{
		pai[i]*=pai[i];
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值