1. 程式人生 > >P1577 切繩子

P1577 切繩子

val blog font max style 最長 一個 相同 問題

題目描述

有N條繩子,它們的長度分別為Li。如果從它們中切割出K條長度相同的

繩子,這K條繩子每條最長能有多長?答案保留到小數點後2位。

輸入輸出格式

輸入格式:

第一行兩個整數N和K,接下來N行,描述了每條繩子的長度Li。

輸出格式:

切割後每條繩子的最大長度。

輸入輸出樣例

輸入樣例#1:
4 11
8.02
7.43
4.57
5.39
輸出樣例#1:
2.00

比較好想的一個二分答案題

樓下說了一種先乘再除的思路,

我來發一份c++代碼。

提醒大家幾個問題:

1.如果你是61分,那麽請把右邊界開大一點。(我一開始還以為爆int了233)

2.如果你是92分&&RE了一個點,請在二分答案的時候加上一句:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define lli long long int 
 4 using namespace std;
 5 const int MAXN=10000001;
 6 inline void read(int &n)
 7 {
 8     char c=getchar();bool flag=0;n=0;
 9     while(c<0||c>9) c==
-?flag==1,c=getchar():c=getchar(); 10 while(c>=0&&c<=9) n=n*10+c-48,c=getchar(); 11 } 12 int n,k; 13 int a[MAXN]; 14 int pd(int val) 15 { 16 int sum=0; 17 for(int i=1;i<=n;i++) sum+=a[i]/val; 18 return sum>=k; 19 } 20 int main() 21 { 22 read(n);read(k);
23 for(int i=1;i<=n;i++) 24 { double p;scanf("%lf",&p); a[i]=p*100; } 25 int l=0,r=100000000,ans=0; 26 while(l<=r) 27 { 28 int mid=l+r>>1; 29 if(mid==0) break; 30 if(pd(mid)) l=mid+1,ans=mid; 31 else r=mid-1; 32 } 33 printf("%.2lf",(double)ans/100); 34 return 0; 35 }

P1577 切繩子