最少的总枕头数可以找规律求
举个例子:
k=2,n=6
当k上枕头数为3时,所有人的枕头数
2,3,2,1,1,1
更生动一点:
*
* * *
* * * * * *
wa了好多发,最后结束了发现改成longlong就对了,虽然n,m,k的范围都在int内,但judge里求最少的总枕头数可能超过int范围,好智障啊,好菜啊
#include<stdio.h>
#include<algorithm>
using namespace std;
long long int ans=0,minn,t,n,m,k;
int check(long long int x);
int main()
{
long long int le,ri,mid,ans;
scanf("%lld %lld %lld",&n,&m,&k);
le=1,ri=m;
while(le<=ri)
{
mid=(le+ri)>>1;
if(check(mid))
{
ans=mid;
le=mid+1;
}
else
ri=mid-1;
}
printf("%lld\n",ans);
return 0;
}
long long int jisuan1(long long int x,long long int y)
{
return ((1+x)*x/2+y-x);
}
long long int jisuan2(long long int x,long long int y)
{
return ((2*x+1-y)*y/2);
}
int check(long long int x)
{
long long int sum=0;
if(x<=k)
{
sum+=jisuan1(x,k);
}
else
{
sum+=jisuan2(x,k);
}
if((x-1)<=(n-k))
{
sum+=jisuan1(x-1,n-k);
}
else
{
sum+=jisuan2(x-1,n-k);
}
if(sum<=m)
return 1;
else
return 0;
}