题目链接:https://cn.vjudge.net/problem/CodeForces-760B
题意给你n张床,m个枕头,要求每个人都得至少有一张床和一个枕头,但是相邻的两个人的枕头的数量差的绝对值不能超过1
问第k个位置的人最多可以有多少个枕头(在保证所有枕头都用完的情况下)
思路:先保证每个人都有一个枕头,再直接二分答案,通过求等差数列的和来判断答案大或小
等差数列的话 注意找到首项a1 和 项数N
#include <bits/stdc++.h>
#define ll long long
const int maxn = 1e5+5;
using namespace std;
ll n,m,k;
bool solve(ll mid) {
ll tempn=k;//k位置之前(包括k的项数)
ll tempm=n-k;//k位置之后(不包括k的项数)
ll a1 = mid - k + 1;//k位置之前的数列的首项,k当末项
ll a2 = mid - n + k;//k位置之后的数列的首项,k-1当末项
if(a1<=0) {//如果首项小于等于0代表,扩展不到第一项
tempn-=(1-a1);
a1 = 1;
}
if(a2<=0) {
tempm-=(1-a2);
a2 = 1;
}
ll ans = tempn*(a1+mid) /2;
ll ans1= tempm*(mid-1+a2)/2;
return ans+ans1<=m;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
m-=n;
ll l=1,r=m,ans=0;
while(r>=l) {
ll mid = l+r>>1;
if(solve(mid)) {
l=mid+1;
ans = mid;
}
else
r= mid-1;
}
printf("%lld\n",ans+1);
return 0;
}