做题记录整理二分1 P1003 采集浆果(2022/9/15)

P1003 采集浆果
由于这个题目不是洛谷的,容易搞丢,就直接把题目拷过来

Description
zty要给喜欢的人们,每人送一篮浆果。
一共有n种不同种类的浆果,第i种浆果有a_i个。
由于zty比较挑剔,他挑选出的每一篮浆果,一定要含有至少k种不同种类的浆果。
请问zty最多能组合出多少篮浆果?

Format
Input
第一行两个正整数n和k,其含义见题目描述
第二行为n个非负整数,第i个数a_i,代表第i类浆果有多少个。

Output
输出一行,一个正整数,代表最多能组合出多少篮浆果

Samples
输入数据 1
5 3
1 2 3 4 5

输出数据 1
5

输入数据 2
5 3
1 1 3 4 5

输出数据 2
4

输入数据 3
10 3
2 2 2 2 2 2 2 2 2 999

输出数据 3
9

输入数据 4
10 3
3 3 3 3 3 3 3 3 3 3

输出数据 4
10

输入数据 5
4 1
1 2 3 4

输出数据 5
10

Limitation
对于50%的数据,1<=k , n, a_i ≤20 1≤k,n,ai≤20

对于另外50%的数据,1<=k,n≤5×10^5, 0 <=q a_i<=2147483647

这题的难点其实不在于二分,而在于想到二分,

#include<bits/stdc++.h>
#define for1(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
ll a[500005],n,k,ji,ans;
bool check(ll x)
{
	ll ans=0;
	for1(i,1,n)
	{
		ans+=min(x,a[i]);
	}
	if(ans>=x*k) return true;
	return false;
}
int main()
{
	cin>>n>>k;
	for1(i,1,n)
	scanf("%d",a+i),ji+=a[i];
	ll l=0;
	ll r=ji/k+1;
	while(l<r)
	{
		ll mid=(l+r)/2;
		if(check(mid)) l=mid+1,ans=mid;
		else r=mid-1;
	}
	if(check(ans+1)) 
	cout<<ans+1<<endl;
	else 
	cout<<ans<<endl;
	return 0;
}
posted @ 2022-09-15 16:49  yyx525jia  阅读(34)  评论(0)    收藏  举报