1. 程式人生 > >暑假集訓——貪心專題——C題

暑假集訓——貪心專題——C題

貪心

題意:你有n個蛋糕,每個蛋糕為半徑不同的圓柱體,圓柱體高為1,你有f個朋友要來,現在來分蛋糕,使每個朋友所分得的蛋糕體積相同,而且不能那兩個蛋糕拼在一起給朋友,問每個朋友能拿到的蛋糕的最大體積。

思路:二分列舉答案mid,判斷所列舉的答案mid是否符合要求,如果列舉的mid不符合要求,那麼mid就太大了,r=mid。如果符合要求,就繼續找更大的mid,l=mid。

#include<iostream>
#include<cstdio>
#include<cmath>
#define eps 1e-6
#define PI acos(-1.00)
using namespace std;

int n,f;
int a[10001];
double v[10001];
double sum,V;

bool is(double x)
{
	int num=0;
	for(int i=0;i<n;i++)
	{
		if(x<=v[i]) num+=(int)(v[i]/x);//判斷每塊蛋糕可分幾塊體積為x的蛋糕
	}
	if(num>=f+1) return true;//如果所分得蛋糕數大於朋友和自己的數量,那麼返回正確。注意自己也算進去
	else return false;
}

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		sum=0;
		scanf("%d%d",&n,&f);
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			v[i]=PI*a[i]*a[i];//計算每塊蛋糕的體積
			sum+=v[i];
		}
		V=sum/(f+1);//求得每個人可以分得的最大體積(理想情況下)
		double l=0.0,r=V,mid;
		while((r-l)>eps)//二分搜尋答案
		{
		    mid=(l+r)/2;
			if(is(mid)) l=mid;//可以的話往更大地找
			else r=mid;//不可以以的話往更小地找
		}
		printf("%.4lf\n",mid);
	}
	return 0;
}