题意: 初始给你一个盒子,里面有n个球。每一次操作,可以新加一个空盒子,把之前所有盒子中的球拿出一个,放到新加的盒子中,如果此时之前的盒子空了,就去掉。然后按 照盒子中的球数排下序。他要边魔术,需要满足之后达到末次操作后,后面的每次操作都是和之前状态相同。问给n个球,能满足情况球数最大是多少。
题解: 通过举例子,发现,至由满足一个数满足(1-m)前m项之和的数才能符合条件,所以可以解方程,可以二分逼近。
刚开始写的解方程,m*(m+1)/2=n m=(sqrt(1+8n)-1)/2;
结果为m*(m+1)/2;
样例几乎都过了,这个网站能给数据,然后返回正确结果。对比了很多都没发现错误。但是一直Wa 后来才知道,这样算有误差,因为这样的结果有可能会大于n,
需要m后移一位输出m(m-1)/2.
然后用了二分,不用考虑结果是否会大于n。直接ac。
#include<math.h>
#include<stdio.h>
#define ll long long
int main(){
ll n,ca=1;
scanf("%lld",&n);
while(n--){
ll m,ans=-1,mid;
scanf("%lld",&m);
printf("Case #%d: ",ca++);
ll l=1,r=2e9;
while(l<=r){
mid=(l+r)/2;
if(mid*(mid+1)==2*m) {
ans=m;break;
}
if(mid*(mid+1)<2*m) l=mid+1;
else r=mid-1;
}
if(ans==-1) {
if(r&1) printf("%lld\n",(r+1)/2*r);
else printf("%lld\n",r/2*(r+1));
}
else printf("%lld\n",ans);
}
return 0;
}