1. 程式人生 > 實用技巧 >CVPR 2020 細粒度分類挑戰賽冠軍方案:資料增強+知識蒸餾,效果大幅提升

CVPR 2020 細粒度分類挑戰賽冠軍方案:資料增強+知識蒸餾,效果大幅提升

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     int
ans=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 double
max=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.心得體會(對本次實踐收穫及疑惑進行總結):

條件判斷一直沒把握好,即便對了也沒能很好的理解、一開始以為二分查詢很容易、但一擴充套件、雖然修改的不多,卻不便於理解

看來還是得多做題、要學好二分法還是挺難的接受的