poj 1064 Cable master

   給出N條電纜,要求切出K段長度均爲L 的電纜,要求L的最大值。可用二分法解決。一開始是用浮點數和下界函數來處理數據的,後來覺得在精度的控制上可能會出一些問題。受到同學的啓發後,決定對每條電纜長 X 100作整數處理。代碼使用遞歸實現。其中有一個需要注意的地方 : 針對筆者的代碼,當mid = 0 的時候,只有一種情況:low = 1 , high = 0 這是其中一個沒有解的出口,而這種情況在遞歸開始的第一條語句( low > high ) 時就被過濾掉了。所以不用擔心後面會因爲除零而RE。

   

   codes:

#include <stdio.h>
#include <math.h>
 
int N,K,a[10001];
int total, bigg;
int solve(int low , int high ) {
   if ( low > high )
      return high;
   int cnt = 0 , mid = (low+high)/2;
   for ( int i = 1 ; i <= N ; i ++ )
      cnt += a[i]/mid;
   if ( cnt < K )
      return solve(low,mid-1);
   else
      return solve(mid+1,high);
}
 
int main() {
   scanf("%d%d",&N,&K);
   total = bigg = 0;
   double v;
   for ( int i = 1 ; i <= N ; i ++ )
   {
      scanf("%lf",&v);
      a[i] = int(v*100.0);
      bigg = bigg < a[i] ? a[i] : bigg;
      total += a[i];
   }
   printf("%.2f\n",solve(1,bigg)/100.0);
   return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章