我有一个不用二分极其简单的方法请管理员开题解
查看原帖
我有一个不用二分极其简单的方法请管理员开题解
782985
huangboming楼主2024/8/2 15:39

@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;
}
2024/8/2 15:39
加载中...