[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 }

 

你可能感兴趣的:(master)