【POJ - 1064】Cable master
【POJ – 1064】Cable master(二分)
Cable master
Descriptions
输入2个数 N K
n条绳子 要分成大于等于k段
求每段最长多长呢?并且每段不能小于1cm
必须以厘米精度写入数字,小数点后正好是两位数。
如果无法切割所请求的每个长度至少为1厘米的件数,则输出文件必须包含单个数字“0.00”(不带引号)。
多组文件输入
Sample Input
- 4 11
- 8.02
- 7.43
- 4.57
- 5.39
Sample Output
- 2.00
题目链接
https://vjudge.net/problem/POJ-1064
这个输出是个坑点,不能直接用double,然后 printf(“%.2f\n”)这会自动四舍五入,是错误的,我看其他大佬的方法是,输入时先*100输出的时候/100就能解决这个输出问题
其他的没什么,就是二分,不懂的再看看代码吧
AC代码
- #include <iostream>
- #include <cstdio>
- #include <fstream>
- #include <algorithm>
- #include <cmath>
- #include <deque>
- #include <vector>
- #include <queue>
- #include <string>
- #include <cstring>
- #include <map>
- #include <stack>
- #include <set>
- #include <sstream>
- #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
- #define Mod 1000000007
- #define eps 1e-6
- #define ll long long
- #define INF 0x3f3f3f3f
- #define MEM(x,y) memset(x,y,sizeof(x))
- #define Maxn 10000+5
- using namespace std;
- int l,r;//左,右
- int N,K;
- int main()
- {
- while(cin>>N>>K)
- {
- int len[Maxn];//绳子
- for(int i=0; i<N; i++)
- {
- double t;
- cin>>t;
- len[i]=t*100.0;
- }
- sort(len,len+N);//排序,直接找最大值
- l=1,r=len[N-1];
- int ans=0;//答案
- while(l<=r)
- {
- int mid=(l+r)/2;
- int cnt=0;//计数器,是否大于等于K
- for(int i=0; i<N; i++)
- cnt+=len[i]/mid;
- if(cnt>=K)
- {
- l=mid+1;
- ans=max(ans,mid);//找最大值
- }
- else
- r=mid-1;
- }
- printf("%.2f\n",(double)ans/100.0);
- }
- return 0;
- }