[POJ] 1064 Cable master (二分查找)
题目地址:http://poj.org/problem?id=1064
有N条绳子,它们的长度分别为Ai,如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长。
二分绳子长度,然后验证即可。复杂度o(nlogm)
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<time.h> 8 #include<stdlib.h> 9 #include<map> 10 #include<stack> 11 #include<queue> 12 #include<vector> 13 using namespace std; 14 #define clr(x,y) memset(x,y,sizeof(x)) 15 #define sqr(x) ((x)*(x)) 16 #define rep(i,a,b) for(int i=(a);i<=(b);i++) 17 #define LL long long 18 #define INF 0x3f3f3f3f 19 #define A first 20 #define B second 21 const int N=10000+131; 22 int n,k; 23 double a[N]; 24 25 bool check(double len) 26 { 27 int num=0; 28 for(int i=0;i<n;i++) { 29 num+=(int)(a[i]/len); 30 } 31 return num>=k; 32 } 33 34 35 void solve() 36 { 37 double lb=0,ub=INF; 38 39 scanf("%d%d",&n,&k); 40 for(int i=0;i<n;i++) { 41 scanf("%lf",&a[i]); 42 } 43 44 for(int i=0;i<100;i++) { 45 double mid=(lb+ub)/2; 46 if(check(mid)) { 47 lb=mid; 48 } else { 49 ub=mid; 50 } 51 } 52 printf("%.2f\n",floor(ub*100)/100); 53 } 54 55 int main() 56 { 57 solve(); 58 59 return 0; 60 }