hadoop入門----官方案例grep wordcount 簡單上手
阿新 • • 發佈:2020-10-10
1.題目:派
2.題目描述:
我的生日要到了!根據習俗,我需要將一些派分給大家。我有N個不同口味、不同大小的派。有F個朋友會來參加我的派對,每個人會拿到一塊派(必須一個派的一塊,不能由幾個派的小塊拼成;可以是一整個派)。
我的朋友們都特別小氣,如果有人拿到更大的一塊,就會開始抱怨。因此所有人拿到的派是同樣大小的(但不需要是同樣形狀的),雖然這樣有些派會被浪費,但總比搞砸整個派對好。當然,我也要給自己留一塊,而這一塊也要和其他人的同樣大小。
請問我們每個人拿到的派最大是多少?每個派都是一個高為1,半徑不等的圓柱體。
輸入格式:
第一行包含兩個正整數N和F,1 ≤ N, F ≤ 10 000,表示派的數量和朋友的數量。 第二行包含N個1到10000之間的整數,表示每個派的半徑。
輸出格式:
輸出每個人能得到的最大的派的體積,精確到小數點後三位。
輸入樣例:
3 3
4 3 3
輸出樣例:
在這裡給出相應的輸出。例如:
25.133
3.演算法描述:
二分法,從指定範圍內進行類似二分查詢的演算法、直到找到滿足條件為止
程式碼:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 const double PI=acos(-1.0); 6 7 int find(double a[], int len, double mv){ 8 intans=0; 9 for(int j=0;j<len;j++){ 10 ans+=int(a[j]/mv); 11 } 12 return ans; 13 } 14 int main(){ 15 int n,f; 16 scanf("%d%d",&n,&f); 17 double v[n]; 18 int b; 19 for(int j=0;j<n;j++){ 20 scanf("%d",&b); 21 v[j]=b*b*PI; 22 } 23 doublemax=v[0]; 24 for(int j=1;j<n;j++){ 25 if(max<v[j]){ 26 max=v[j]; 27 } 28 } 29 double right=max; 30 double left=1; 31 double mid; 32 while((right-left)>1e-6){ 33 mid=left+(right-left)/2; 34 if(find(v,n,mid)>=f+1){ 35 left=mid; 36 }else{ 37 right=mid; 38 } 39 } 40 printf("%.3f",mid); 41 return 0; 42 }
4.演算法時間及空間複雜度分析(要有分析過程):
時間複雜度:類似二分查詢 O (logN) 空間複雜度:O(1)
5.心得體會(對本次實踐收穫及疑惑進行總結):
條件判斷一直沒把握好,即便對了也沒能很好的理解、一開始以為二分查詢很容易、但一擴充套件、雖然修改的不多,卻不便於理解
看來還是得多做題、要學好二分法還是挺難的接受的