UVA-10025-The ? 1 ? 2 ? ... ? n = k problem

   乍眼一看,这题找不出什么规律,可是列举出所有的想法时,就有一点思路了。

   这题无非是这样:±1 ± 2 ± 3 ±…± n = k , 找出满足条件的最小 

   令S(n)=1 + 2 + 3 + ... + n. 其中一项为x.

     那么S(n)=1 + 2 + 3 + ...+ x + ... + n. 这样结果可能大于等于 | k | ,等于最好,即一次算出。

     所以我们把+ x 改成- x,此时得到新的关系:S'(n)=1+2+...-x+...+n.

     => S(n)-S'(n)=2x;且k=S'(n).令y=2x.

      利用这个特性,找出一个满足条件的y(即y是偶数)即可。

       但又有问题,那就是数据问题。题目不知一个数据,每个数据范围相当于|k|≤10^9,所以每次要是从1+2+3+...+n直到≥k时为止,这可能费时。

     所以我们可利用等差公式前n项和公式,S(n)=n(n+1)/2,可以大致估略n=√2S(n),从这个开始枚举可快很多。

      还有一点就是一个特殊的数据,就是k=0n=3,而不是n=0,因为按照上面想法去实现会产生0,即判断一下当k=0时,输出3即可;其他的没有特殊情况。



#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int T,k,n,ans,s;
int main()
{
    scanf("%d",&T);
    for(int t=0;t<T;t++)
    {
       if(t) printf("\n");
       scanf("%d",&k);
       if(!k){ printf("3\n"); continue; }
       k=abs(k);
       n=(int)sqrt(k<<1);
       s=n*(n+1)>>1;
       while(true)
       {
          if(s>=k) break;
          n++;
          s+=n;
       }
       while((s-k)&1)
       {
          n++;
          s+=n;
       }
       printf("%d\n",n);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值