JZOJ 2307. 【中山市选2011】新年礼物

题目

Description

  Windbreaker计划送一些项链给他的朋友们作为新年礼物。为了表示诚意,他决定自己制作全部的项链。他购买了若干种珍珠,每种珍珠都有特定的颜色。他要制作的项链都是M-完美的,也就是每条项链都是恰好由M种珍珠组成的。Windbreaker想知道他最多能送出多少条项链。给定每种珍珠的数目,你要回答的是Windbreaker最多可以制作多少条M-完美项链。
 

Input

  输入包含多组测试数据。每组数据第一行是一个正整数n,代表有n种珍珠。第二行包含n个正整数,代表每种珍珠的数目。第三行包括1个正整数M,代表要制作的是M-完美项链。   输入数据以1行n=0结束。这组数据不用处理。

Output

  对每组测试数据,输出一行答案,为一个整数,代表最多能制作的M-完美项链的数目。
 

Sample Input

5 3 3 3 3 3 5 6 1 2 3 4 5 6 5 0

Sample Output

3 3
 

Data Constraint

对20%的数据,有n<=10;

对40%的数据,有n<=100;

对100%的数据,有n<=1000,每种珍珠数目不超过2000,1<=M<=100。

 

分析

  •  原来我想的是优先队列,一直去前m最大值,但不知道为啥一直0
  • 没有办法了,二分枚举答案判断合法性

代码

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 long long f[10001];
 5 long long a[10001]; 
 6 long long n,m;
 7 bool check(long long now)
 8 {
 9     long long sum=0;
10     for (int i=1;i<=n-m;i++)
11        sum+=a[i];
12     for (int i=n-m+1;i<=n;i++)
13     {
14         if (a[i]<now)
15         {
16             sum-=now-a[i];
17             if (sum<0) return false;
18         }
19     }
20     return true;
21 }
22 int main ()
23 {
24     cin>>n;
25     while (n!=0)
26     {
27         long long ans=0;
28         for (int i=1,x;i<=n;i++)
29         {
30             cin>>a[i];
31             ans+=a[i]; 
32         }
33         cin>>m;
34         sort(a+1,a+1+n);
35         long long l=1,r=ans/m;
36         while (l<=r)
37         {
38             long long mid=(l+r)/2;
39             if (check(mid))
40                 l=mid+1;
41             else
42                 r=mid-1;
43         }
44         cout<<r<<" ";
45         cin>>n;
46     }
47 }

 

猜你喜欢

转载自www.cnblogs.com/zjzjzj/p/10741192.html