實數二分,精度會缺失(如果直接用double二分,最後%.2lf輸出的時候會自動向上取整,可能改變了答案),解決辦法是先把每根繩子長度a[i]乘以100化為整數,再按整數的方法二分,最後輸出答案時再除以100即可。
注意在二分過程中要特判m=0的情況(否則在judge函式中會除以0導致re),m=0時直接break退出二分迴圈,記下答案ans=0。
#include
using namespace std;
const
int n=
1e4+10;
double x,ans;
int n,k,l,r,m,a[n]
;bool judge
(int m)
intmain()
l=0,r=
1e7;
while
(l<=r)
//n=1 k=10000 a[1]=1.00時,二分過程中會出現m=0的情況,在judge函式中會除以0導致re
//要防止re,則特判二分過程中m=0直接break,退出二分,記下答案ans=0if(
judge
(m))ans=
1.0*m,l=m+1;
//滿足if(judge(m)),記下ans
else r=m-1;
}printf
("%.2lf\n"
,ans/
100.0);
}return0;
}
洛谷 P1577 切繩子 二分
題目描述 有n條繩子,它們的長度分別為li。如果從它們中切割出k條長度相同的 繩子,這k條繩子每條最長能有多長?答案保留到小數點後2位。輸入輸出格式 輸入格式 第一行兩個整數n和k,接下來n行,描述了每條繩子的長度li。輸出格式 切割後每條繩子的最大長度。輸入輸出樣例 輸入樣例 1 4 11 8.0...
洛谷 P1577 切繩子
原題 有n條繩子,它們的長度分別為li。如果從它們中切割出k條長度相同的繩子,這k條繩子每條最長能有多長?答案保留到小數點後2位。輸入輸出格式 輸入格式 第一行兩個整數n和k,接下來n行,描述了每條繩子的長度li。輸出格式 切割後每條繩子的最大長度。輸入輸出樣例 輸入樣例 1 複製 4 11 8.0...
洛谷 P1577 切繩子
網線主管。我一直奇怪為什麼洛谷沒有網線主管,原來是有人抄得一模一樣。在洛谷上ac可以去交一下 不用改 首先看到這資料範圍,然後又是求最優解,首先就要考慮下貪心行不行 我嫌浮點數乘除麻煩,就讀入時乘上100,中間二分時r的範圍也要乘上100,最後輸出時除以100 因為c 自帶整除 偏向0取整,你可以試...