我是用二分的,为什么当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);
}
求大佬解答。