1 条题解

  • 0
    @ 2021-11-19 9:56:44

    赛时这题我都没做出来,我退役吧 \kk。

    思路还是比较简单的。

    就是考虑每次选 kk 个数,就相当于有 kk 个盒子,你需要把数放进去。

    但你不能在一个时刻把一个数放到两个盒子中。

    此时一个思路就是二分答案,因为答案显然满足单调性。

    设当前的答案是 xx

    那么一个东西可以放最多 min{x,ai}\min\{x,a_i\} 次。

    贪心一下,把这个东西加起来,和 k×xk\times x 比较一下就好了。


    代码
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+5;
    int n,k;
    ll a[N];
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    	ll l=0,r=1e18/k;//防止炸long long
    	while(l+1<r){
    		ll mid=l+r>>1ll,sum=0;
    		for(int i=1;i<=n;i++)sum+=min(mid,a[i]);
    		if(sum>=1ll*mid*k)l=mid;
    		else r=mid;
    	}
    	ll sum=0;
    	for(int i=1;i<=n;i++)sum+=min(r,a[i]);
    	if(sum>=1ll*r*k)printf("%lld",r);
    	else printf("%lld",l);
    }
    
    • 1

    信息

    ID
    52
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者