题意:有n个床排成一排,有m个枕头,求第k个床最多能拿到的枕头数,且满足相邻的床相差不大于1,每个床至少有一个枕头。
分析:二分第k个床最多能有几个枕头,然后根据第k个床的枕头个数,可以依次推出最少相邻枕头的个数,如果枕头个数的和大于m就不符合,r=mid-1;否则l=mid+1;
(return 的时候应该返回r)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k;
bool f(ll x)
{
ll sum=0;
if(k<=x) sum+=(2*x-k+1)*k/2;
else sum=sum+(x+1)*x/2+k-x;
ll tmp=n-k+1;
if(tmp<=x) sum+=(2*x-tmp+1)*tmp/2;
else sum=sum+(x+1)*x/2+tmp-x;
sum-=x;
if(sum<=m) return true;
return false;
}
ll solve()
{
ll l=1,r=m,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(f(mid)) l=mid+1;
else r=mid-1;
}
return r;
}
int main()
{
scanf("%I64d%I64d%I64d",&n,&m,&k);
printf("%I64d\n",solve());
}