Descriptions

输入2个数 N  K

n条绳子    要分成大于等于k段

求每段最长多长呢?并且每段不能小于1cm

必须以厘米精度写入数字,小数点后正好是两位数。
如果无法切割所请求的每个长度至少为1厘米的件数,则输出文件必须包含单个数字“0.00”(不带引号)。

多组文件输入

Sample Input

  1. 4 11
  2. 8.02
  3. 7.43
  4. 4.57
  5. 5.39

Sample Output

  1. 2.00

题目链接

https://vjudge.net/problem/POJ-1064

 

这个输出是个坑点,不能直接用double,然后 printf(“%.2f\n”)这会自动四舍五入,是错误的,我看其他大佬的方法是,输入时先*100输出的时候/100就能解决这个输出问题

其他的没什么,就是二分,不懂的再看看代码吧

 

AC代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <deque>
  7. #include <vector>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. #include <sstream>
  15. #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
  16. #define Mod 1000000007
  17. #define eps 1e-6
  18. #define ll long long
  19. #define INF 0x3f3f3f3f
  20. #define MEM(x,y) memset(x,y,sizeof(x))
  21. #define Maxn 10000+5
  22. using namespace std;
  23. int l,r;//左,右
  24. int N,K;
  25. int main()
  26. {
  27. while(cin>>N>>K)
  28. {
  29. int len[Maxn];//绳子
  30. for(int i=0; i<N; i++)
  31. {
  32. double t;
  33. cin>>t;
  34. len[i]=t*100.0;
  35. }
  36. sort(len,len+N);//排序,直接找最大值
  37. l=1,r=len[N-1];
  38. int ans=0;//答案
  39. while(l<=r)
  40. {
  41. int mid=(l+r)/2;
  42. int cnt=0;//计数器,是否大于等于K
  43. for(int i=0; i<N; i++)
  44. cnt+=len[i]/mid;
  45. if(cnt>=K)
  46. {
  47. l=mid+1;
  48. ans=max(ans,mid);//找最大值
  49. }
  50. else
  51. r=mid-1;
  52. }
  53. printf("%.2f\n",(double)ans/100.0);
  54. }
  55. return 0;
  56. }

 

posted on 2019-08-03 19:32 Sky丨Star 阅读() 评论() 编辑 收藏

版权声明:本文为sky-stars原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sky-stars/p/11295983.html