1. 程式人生 > >01派【北京大學ACM/ICPC競賽訓練暑期課】

01派【北京大學ACM/ICPC競賽訓練暑期課】

北京 col ace pac 兩個 需要 return 參加 !=

01:派

總時間限制:
1000ms
內存限制:
65536kB
描述

我的生日要到了!根據習俗,我需要將一些派分給大家。我有N個不同口味、不同大小的派。有F個朋友會來參加我的派對,每個人會拿到一塊派(必須一個派的一塊,不能由幾個派的小塊拼成;可以是一整個派)。

我的朋友們都特別小氣,如果有人拿到更大的一塊,就會開始抱怨。因此所有人拿到的派是同樣大小的(但不需要是同樣形狀的),雖然這樣有些派會被浪費,但總比搞砸整個派對好。當然,我也要給自己留一塊,而這一塊也要和其他人的同樣大小。

請問我們每個人拿到的派最大是多少?每個派都是一個高為1,半徑不等的圓柱體。

輸入
第一行包含兩個正整數N和F,1 ≤ N, F ≤ 10 000,表示派的數量和朋友的數量。
第二行包含N個1到10000之間的整數,表示每個派的半徑。
輸出
輸出每個人能得到的最大的派的體積,精確到小數點後三位。
樣例輸入
3 3
4 3 3
樣例輸出
25.133
 1 #include<cstdio>
 2 #include<cmath>
 3 using namespace std;
 4 const double PI = acos(-1.0);
 5 double a[10010];//放派的體積
 6 
 7 int main()
 8 {
 9     int N,F;
10     scanf("%d %d",&N,&F);
11     
12     double maxV = 0;
13     double
s = 0,e = 0; 14 for(int i = 0; i< N;++i) 15 { 16 int r ; 17 scanf("%d",&r); 18 a[i] = PI*r*r; 19 if(a[i] > e) 20 { 21 e = a[i]; 22 } 23 } 24 while(fabs(e-s) > 1e-5)//while(s!=e) 25 { 26 int num = 0; 27 double
mid = s+(e-s)/2; 28 for(int i = 0; i< N;++i) 29 { 30 num += floor(a[i]/mid);//可以切出來的塊數 31 } 32 33 if(num > F)//切小了 34 { 35 s = mid; 36 } 37 else//切大了 38 { 39 e = mid; 40 } 41 } 42 printf("%.3lf",e); 43 return 0; 44 }

01派【北京大學ACM/ICPC競賽訓練暑期課】