[Jzoj] 2307. 新年礼物

题目描述

W i n d b r e a k e r Windbreaker 计划送一些项链给他的朋友们。他购买了 N N 种珍珠,每种珍珠都有特定的颜色。

他要制作的项链都是 M M- 完美的,也就是每条项链都是恰好由 M M 种珍珠组成的。

W i n d b r e a k e r Windbreaker 想知道他最多能送出多少条项链。给定每种珍珠的数目,你要回答的是 W i n d b r e a k e r Windbreaker 最多可以制作多少条 M M- 完美项链。

题目解析

二分答案

如果珍珠数最大前 m m 种不够组成当前的 m i d mid 串,就从其他珍珠里面借。如果能凑齐 m m 种珍珠每种数量为 m i d mid 的就可以了。

代码

#include<bits/stdc++.h>
#define LL long long 
using namespace std;
LL n,m,t,ans;
LL a[1005],b[1005];
bool check(LL x)
{
    LL sum=0;
    for(int i=1;i<=n-m;i++)
     sum+=a[i];
    for(int i=n-m+1;i<=n;i++)
     if(a[i]<x)
     {
       sum-=x-a[i];
       if(sum<0) return false;
     }
    return true;
}
int main()
{
	scanf("%d",&n);
	while(n!=0)
	{
	  for(int i=1;i<=n;i++)
	   scanf("%d",&a[i]),t+=a[i];
	  scanf("%d",&m);
	  sort(a+1,a+1+n);
	  ans=0;
	  LL l=1,r=t/m,mid;
	  while(l<=r)
	  {
	  	mid=(l+r)/2;
	  	if(check(mid)) l=mid+1,ans=mid;
	  	else r=mid-1;
	  }
	  printf("%d\n",r);
	  scanf("%d",&n);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/89418430