[Jzoj] 2307. 新年礼物

题目描述

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

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

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

题目解析

二分答案

如果珍珠数最大前 m m m种不够组成当前的 m i d mid mid串,就从其他珍珠里面借。如果能凑齐 m m m种珍珠每种数量为 m i d mid 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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值