题意:给出n个人,m个东西,要求第k个人获得的最多,且相邻的两个相差小于2;
思路:二分答案,每次找到一个mid,通过判断最大值和最小的结果,判断mid是否符合条件,最大为nmid 最小(1+mid)/2(n-k) +(1+mid)/2*(k)-k
AC代码:
package 练习;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static Scanner sc=new Scanner(System.in);
static long n,m,k;
public static void main(String[] args) {
n=sc.nextInt();
m=sc.nextInt();
k=sc.nextInt();
m = m-n;
if(m==0){
System.out.println(1);
return;
}
long ans = 0;
long l = 0,r = m;
long mid;
while(l<=r){
mid = (l+r)>>1;
if(check(mid)){
ans = mid;
l = mid+1;
}else {
r = mid-1;
}
}
System.out.println(ans+1);
}
private static boolean check(long x) {
if(k==1||k==n){//如果k在两边
long res = 0;
if(x>n) res = ((x-n+1) + x) * n / 2;
else res = (1+x)*x/2;
return res <= m;
}else{//如果k不在两边,就分成了两部分
long res1=0,res2=0;
if(x>k) res1 = ((x-k+1)+x)*k/2;
else res1 = (1+x)*x/2;
if(x>n-k+1) res2 = ((x-(n-k+1)+1)+x)*(n-k+1)/2;
else res2 = (1+x)*x/2;
return res1 + res2 - x <= m;
}
}
}