- 描述
-
我的生日要到了!根据习俗,我需要将一些派分给大家。我有N个不同口味、不同大小的派。有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成;可以是一整个派)。
我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨。因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好。当然,我也要给自己留一块,而这一块也要和其他人的同样大小。
请问我们每个人拿到的派最大是多少?每个派都是一个高为1,半径不等的圆柱体。 - 输入
- 第一行包含两个正整数N和F,1 ≤ N, F ≤ 10 000,表示派的数量和朋友的数量。
第二行包含N个1到10000之间的整数,表示每个派的半径。 - 输出
- 输出每个人能得到的最大的派的体积,精确到小数点后三位。
- 样例输入
-
3 3 4 3 3
- 样例输出
-
25.133
题目类似007:Aggressive cows,在这里需要考虑浮点数比较问题
AC:
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<cstring> #define DEBUG(x) cout << #x << " = " << x << endl using namespace std; const int MAXN=1e4; const double pi=acos(-1); const double EPS=1e-6; int N,F; double VofPi[MAXN]; bool isEqual(double a,double b) { return abs(a-b)<=EPS; } int feasible(double d) { int num=0; for(int i=0;i<N;i++){ double t=VofPi[i]/d; num+=VofPi[i]/d; } return num-(F+1); } double BinSearch(double lr,double rb) { double lastPos=-1; while(!isEqual(lr,rb)){ double mid=lr+(rb-lr)/2; // DEBUG(mid); if(feasible(mid)>=0){ lastPos=mid; lr=mid; } else rb=mid; } return lastPos; } int main() { // freopen("in.txt","r",stdin); scanf("%d %d",&N,&F); for(int i=0;i<N;i++){ int t; scanf("%d",&t); double v=pi*t*t; VofPi[i]=v; } sort(VofPi,VofPi+N); double lb=0;///pi的大小只要大于零就行 double rb=pi*(1e8); printf("%.3lf ",BinSearch(lb,rb)); return 0; }