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 }
原文地址:https://www.cnblogs.com/mobileliker/p/3873802.html