2015. A New Year Gift

 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值