OpenJudge 2774 木材加工

1.链接:

http://bailian.openjudge.cn/practice/2774/

2.题目:

总Time Limit:
1000ms
Memory Limit:
65536kB
Description
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。

木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数。
Input

第一行是两个正整数NK(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
 

Output
输出能够切割得到的小段的最大长度。如果连1厘米长的小段都切不出来,输出"0"。
Sample Input
3 7

232

124

456

Sample Output
114
Source
NOIP 2004

3.思路:

利用二分查找减少计算的次数

4.代码:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 

 5 using namespace std;

 6 

 7 int main()

 8 {

 9     //freopen("C://input.txt","r",stdin);

10 

11     int i;

12     

13     int n,k;

14     cin >> n >> k;

15 

16     int sum; //sum of stick length

17 

18     int *arr_len = new int[n];

19     memset(arr_len , 0, sizeof(int) * n);

20 

21     sum = 0;

22     for(i = 0; i < n; ++i)

23     {

24         cin >> arr_len[i];

25         sum += arr_len[i];

26     }

27 

28     int max_len = sum / k;

29     int min_len = 1;

30     int mid_len;

31 

32     int count_k;

33     int max = 0;

34 

35     while(min_len <= max_len)

36     {

37         mid_len = (max_len + min_len) / 2;

38 

39         count_k = 0;

40         for(i = 0; i < n; ++i)

41         {

42             count_k += (arr_len[i] / mid_len);

43         }

44 

45         if(count_k >= k)

46         {

47             if(max < mid_len) max = mid_len;

48             min_len = mid_len + 1;

49         }

50         else

51         {

52             max_len = mid_len - 1;

53         }

54     }

55 

56     cout << max << endl;

57 

58     delete [] arr_len;

59 

60     return 0;

61 }

 

你可能感兴趣的:(open)