@Tony2@Register_int@StarLbright40
前言
我有一个不用二分,极其简单的方法,而这里所有的题解都要二分。
核心思路
先排序再求前缀和,最后枚举h
本人代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,a[2000005],x,ans,k,l,qzh[200005],m,o;
bool cmp(ll ai,ll bi){
return ai>bi;
}
int main(){
cin>>n>>k>>l;
if(l>n)l=n;
m=k*l;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
qzh[i]=qzh[i-1]+a[i];
}
for(int i=1;i<=n;i++){
if(a[i]<i){
for(;a[o]<i&&o;o--){}
if(i*(i-o)-qzh[i]+qzh[o]<=m&&i-a[i]<=k){
ans=i;
}
}
else {
ans=i;
o=i;
}
}
cout<<ans;
return 0;
}