J. Pie
我的生日來臨,通常會用餡餅招待客人。是N個大小不同,口味不同的餡餅。我有F個朋友,他們會來參加我的生日宴會,他們每個人都會從某一塊餅中分到一部分,而不是從某幾塊餅中各自分一部分(這麼做會顯得很亂的!)。我們每個人得到的都是同樣大小的餅(形狀可以不同),所有的餡餅都是圓柱形的,它們有同樣的高度,但是半徑可以是不一樣的。我們所能得到的最大的餡餅尺寸是多少?
Input
一行包括一正整數:測試組數。接下來是每組資料說明:
l 一行有2個整數N和F(1≤N,F≤10 000),分別是餡餅和朋友的數量。
l 一行有N個整數ri(1≤ri≤10 000),分別表示N個餡餅的半徑。
Output
對每組測試,輸出一行,表示我和我的朋友所能達到的最大的餡餅尺寸(保留小數6位)。
Sample input |
Sample output |
3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2 |
25.132741 3.141593 50.265482 |
#include<stdio.h>#include<math.h>const double pi=acos(-1); //對於pi這個來講以後切記用這個來賦值double a[11000];int main(){ int x,ji; scanf("%d",&x); while(x--) { int i,n,f; scanf("%d %d",&n,&f); f+=1; double sum=0,max,min,middle; for(i=1;i<=n;i++) { scanf("%lf",&a[i]); a[i]=a[i]*a[i]; sum+=a[i]; } max=sum/f; //確定最大值 min=0; while(max-min>0.00000001) 當兩者的差距做夠小時 middle ,max,min的值就都一樣了 { ji=0; middle=(max+min)/2; for(i=1; i<=n; i++) { ji+=(int)(a[i]/middle); } if(ji>=f)min=middle; //這是典型的二分的條件 if(ji<f)max=middle; } printf("%.6lf\n",pi*middle); } }