P1577 切繩子
阿新 • • 發佈:2017-08-16
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 切繩子