关于二分边界
查看原帖
关于二分边界
1275559
cjx_AK楼主2025/7/27 20:57

我是用二分的,为什么当r=1e10时可以AC,

当r=1e14时会WA?

r=1e10:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int p[2000005];
int k;
bool  check(int x){
	int cnt=0,sum=k*x;
	for(int i=n;i>=1;i--){
		if(p[i]<=x){
			if(x-p[i]+1>x)cnt++;
			sum-=x-p[i]+1;
		}
	}
	return sum>=0&&cnt<=k;
}
signed main(){
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&p[i]);
	}
	sort(p+1,p+n+1);
	int l=0,r=1e10;
	while(l<=r){
		int mid=(r+l)>>1;
		if(check(mid)){
			//	cout<<mid<<'x';
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	printf("%lld\n",l-1);
}

r=1e14:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int p[2000005];
int k;
bool  check(int x){
	int cnt=0,sum=k*x;
	for(int i=n;i>=1;i--){
		if(p[i]<=x){
			if(x-p[i]+1>x)cnt++;
			sum-=x-p[i]+1;
		}
	}
	return sum>=0&&cnt<=k;
}
signed main(){
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&p[i]);
	}
	sort(p+1,p+n+1);
	int l=0,r=1e14;
	while(l<=r){
		int mid=(r+l)>>1;
		if(check(mid)){
			//	cout<<mid<<'x';
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	printf("%lld\n",l-1);
}

求大佬解答。

2025/7/27 20:57
加载中...