记录一个菜逼的成长。。
题目大意:
有n张床,m个枕头。
每个人至少有一个枕头,相邻的床枕头数差不能超过1.问指定的床最多可以获得多少个枕头。
先每张床都给一个。
当床两边都有相邻的床位时。
然后优先给指定的床位,当差超过1时,我们需要给相邻的床位一个枕头。
所以要让指定的床位有两个枕头,要从剩余的枕头里拿出1个。
要让指定的床位有三个枕头,要从剩余的枕头里拿出4个.有两个给旁边的床位。
以此类推。
因为可能指定的床位两边的床数不相等。
所以要考虑多的一边。
当所有的床位超过1个时,每次只需要拿出n个。
#include <bits/stdc++.h>
using namespace std;
#define fin freopen("D://in.txt","r",stdin)
#define fout freopen("D://out.txt","w",stdout)
int main()
{
//fin,fout;
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
int ans = 1;
m -= n;
int t = min(k,n-k+1),flag = 0;
for( int i = 1; i <= t; i++ ){
if(m < i*i){
ans += i-1;
flag = 1;
break;
}
}
if(!flag){
m -= t*t;
ans += t;
flag = 0;
int len = abs(n - 2*t + 1);
for( int i = 1; i <= len; i++ ){
if(m < (t-1)*i + (t+1+t+i)*i/2){
ans += i-1;
flag = 1;
break;
}
}
if(!flag){
m -= (t-1)*len + (2*t+1+len)*len/2;
ans += len;
ans += m / n;
}
}
printf("%d\n",ans);
}
return 0;
}