1. 程式人生 > >hdu1969之二分查詢

hdu1969之二分查詢

Pie

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2735    Accepted Submission(s): 1052


Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are coming to my party and each of them gets a piece of pie. This should be one piece of one pie, not several small pieces since that looks messy. This piece can be one whole pie though.

My friends are very annoying and if one of them gets a bigger piece than the others, they start complaining. Therefore all of them should get equally sized (but not necessarily equally shaped) pieces, even if this leads to some pie getting spoiled (which is better than spoiling the party). Of course, I want a piece of pie for myself too, and that piece should also be of the same size. 

What is the largest possible piece size all of us can get? All the pies are cylindrical in shape and they all have the same height 1, but the radii of the pies can be different.

Input One line with a positive integer: the number of test cases. Then for each test case:
---One line with two integers N and F with 1 <= N, F <= 10 000: the number of pies and the number of friends.
---One line with N integers ri with 1 <= ri <= 10 000: the radii of the pies.

Output For each test case, output one line with the largest possible volume V such that me and my friends can all get a pie piece of size V. The answer should be given as a floating point number with an absolute error of at most 10^(-3).
Sample Input 3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2
Sample Output 25.1327 3.1416 50.2655 題意:有n塊餅分給f個人,一塊餅可以分成多塊,每個人得到的餅只能是來自某一塊餅,每個人分到的餅都是一樣多,問最多每個人能分到多少

分析:求出每塊餅的面積s[i],並記錄面積最大的s[i]為maxs,然後在0~maxs之間進行二分得到mid,判斷是否每個人都能得到面積為mid的餅,如果能則mid=left,否則right=mid

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<cmath>
#include<iomanip>
#define INF 99999999
using namespace std;

const int MAX=10000+10;
const double PT=3.14159265358979323846;
double s[MAX];
int t,n,m;

bool search(double v){
	int sum=0;
	for(int i=0;i<n;++i){
		sum+=(int)(s[i]/v);
	}
	if(sum>=m)return true;
	else return false;
} 

int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		++m;
		double maxs=-INF,mins=0,mid=0;
		for(int i=0;i<n;++i){
			cin>>s[i];
			s[i]=PT*s[i]*s[i];
			maxs=max(maxs,s[i]*1.0);
		}
		while(fabs(mins-maxs)>1e-6){
			mid=(mins+maxs)/2;
			if(search(mid))mins=mid;
			else maxs=mid;
		}
		cout<<fixed<<setprecision(4)<<mid<<endl;
	}
	return 0;
}