- 二分+数学
题目:https://codeforces.com/problemset/problem/760/B
题意:n个床,m个枕头,F睡在k号床(1<=k<=n);任意相邻的两个床枕头数相差不能超过1,问F最多能有几个枕头
解题思路:y代表F左右两边的的人数,x是F所拥有的枕头数,求F左右两边所有人的最小枕头数和
若y>x-1
否则如果y<=x-1
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,k;
long long getsum(long long x,long long y){
if(y==0) return 0;
if(y>=x-1) return x*(x-1)/2+y-(x-1);
if(y<x-1) return (x-1+x-y)*y/2;
}
int check(long long x){
long long p=k-1; //左边的人数
long long q=n-k; //右边人数
long long sum=getsum(x,p)+getsum(x,q)+x;
if(sum<=m) return 1;
return 0;
}
int main(){
long long ans;
while(cin>>n>>m>>k){
long long l=0,r=1e9,mid;
while(l<r){
mid=(l+r+1)>>1;
if(check(mid)){
l=mid;
}
else r=mid-1;
}
cout<<l;
}
}