做题记录整理二分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;
}

浙公网安备 33010602011771号