网线切割
第二题。
原题链接:https://www.luogu.org/problem/show?pid=1297#sub
果然牵扯到浮点数题目就开始变得比较恶心人了啊。。
思路是有一步转化,先把米转换成厘米,转化成整数进行二分然后再转回来,这样好做一些。
和切木头那个题很像,也是要记录一个cnt,判断这个值和k的关系。
有一些细节部分需要好好处理。
参考代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #define maxn 10005 5 #define maxl 1000000005 6 using namespace std; 7 int k,n,cnt; 8 int a[maxn]; 9 double b,ans; 10 inline int read(){ 11 int num = 0; 12 char c; 13 bool flag = false; 14 while ((c = getchar()) == ' ' || c == '\n' || c == '\r'); 15 if (c == '-') 16 flag = true; 17 else 18 num = c - '0'; 19 while (isdigit(c = getchar())) 20 num = num * 10 + c - '0'; 21 return (flag ? -1 : 1) * num; 22 } 23 bool check(int x){ 24 cnt=0; 25 for (int i=1;i<=n;i++) 26 cnt+=a[i]/x; 27 if (cnt>=k) 28 return true; 29 else 30 return false; 31 } 32 int main(){ 33 n = read();k = read(); 34 for (int i=1;i<=n;i++){ 35 scanf("%lf",&b); 36 a[i] = b * 100; 37 } 38 int l = 0; 39 int r = maxl; 40 int mid; 41 while (l <= r){ 42 mid=(l + r + 1) / 2; 43 if (l == r) 44 break; 45 if (check(mid)) 46 l = mid; 47 else 48 r = mid - 1; 49 } 50 ans = mid * 1.00 / 100; 51 printf("%.2lf",ans); 52 return 0; 53 }
一切无法杀死我的,都将使我变得更加强大。