代码改变世界

2015. A New Year Gift

2011-05-20 23:32  Min·zc  阅读(256)  评论(0编辑  收藏  举报
 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 }