1
/*
2
*因为可以大致估算出答案的上下界所以可以使用二分法对答案进行逼近
3
*对于给定的数列,对多了一产生sum/m条项链,这个就是答案的上界,下界自然就是0
4
*然后验证某一个解的正确性
5
*如果ans大于某一种珍珠i的个数,那么,此种珍珠就选择ans个,如果选择多于ans个
6
*就会出现i珍珠在一条项链上出现多余一个的情况。如果某种珍珠的个数多于ans个那
7
*么就将其全部选入。此时可能出现两种情况,一种是刚刚好可以组成ans条项链,
8
*另一种就是可以组成多余ans条的项链,那么tem就会大于m*ans
9
*剩下的就是二分的使用了
10
*
11
*/
12
13
14
#include
<iostream>
15
#include
<memory.h>
16
using
namespace std;
17
int n;
18
int m;
19
int pr[
1001];
20
int check(
int ans)
21 {
22
int tem=
0;
23
for(
int i=
0;i<n;i++)
24
if(pr[i]<ans)
25 tem+=pr[i];
26
else
27 tem+=ans;
28
if(tem>=m*ans)
29
return
1;
30
else
31
return
0;
32 }
33
int main()
34 {
35
while(cin>>n,n!=
0)
36 {
37
int sum=
0;
38
for(
int i=
0;i<n;i++)
39 {
40 cin>>pr[i];
41 sum+=pr[i];
42 }
43 cin>>m;
44
int low=
0;
45
int ans=
0;
46
while(low<=sum)
47 {
48
int mid=(low+sum)/
2;
49
if(check(mid))
50 {
51 ans=mid;
52 low=mid+
1;
53 }
54
else
55 sum=mid-
1;
56 }
57 cout<<ans<<endl;
58 }
59 }
转载于:https://www.cnblogs.com/congzc/archive/2011/05/20/2329951.html