二分查找之派

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
bool IsValid(int F,double fmax,vector<double> veccakev)
{
	int F1=0;
	for(int i=0;i<veccakev.size();i++)
	{
		F1=F1+(int)(veccakev[i]/fmax);
	}
	if(F1>=(F+1))
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	int N=0,F=0;
	cin>>N>>F;
	int icakenum=N;
	vector<double> veccakev;
	while((icakenum--)>0)
	{
		int r=0;
		cin>>r;
		veccakev.push_back(r*r*acos(-1.0));
	}

	//二分法
	double fmin=0,fmax=0;
	for(int i=0;i<veccakev.size();i++)
	{
		fmax+=veccakev[i];
	}
	fmax=fmax/(F+1);
	double fvalue=(fmax+fmin)/2;
	while((fmax-fmin)>1e-5)
	{
		if(IsValid(F,fvalue,veccakev))
		{
			fmin=fmin+(fmax-fmin)/2;
		}
		else
		{
			fmax=fmax-(fmax-fmin)/2;
		}
		fvalue=(fmax+fmin)/2;
	}
	printf("%.3lf\n",(fvalue));

	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章