POJ 1844: Sum(数列推导)

来源:互联网 发布:js excel 编辑:程序博客网 时间:2024/05/16 08:46
注:这个代码版本短小精悍,题解精巧,于是转了。


* 一:sum一定要大于或等于输入的S.(等于时就已经找到了答案)

   小于的话就算全做加法运算也不能达到S

            

* 二:在满足第一条的情况下,注意一定要满足第一条后

   第一次碰到(sum - S ) % 2 == 0

* 这里( sum = 1 + 2  + .... + i )这时的i就是答案。


 证明如下:

       1:若res是奇数,就说明res = ( 1 + 2 + ... + i )- S 是奇数

        也就是说无论你怎么改变sum( sum = 1 + 2  + .... + i )表达式(当然是通过改变其中的加号为减号)也无法让res0。

        举个例子吧:S = 5, sum = 1+2+3 = 6, res = 6 - 5 = 1;

   无论怎样改变(1+2+3)中的加号也没用,这是因为你在sum中改变一个加号为减号时,它的值就一定减少了一个偶数值(这是显然的)sum-S仍然为奇数。

       2:令res = sum - S,则res一定是02, 4, 6....中的一个

       下面说明总可以通过改变sum表达式中的某几个加号为减号使得res0

         k = 0的情况就不用说明了吧, 假设2k表示res 显然k = 1 2 3 4...

         k = 1 时可以通过把sum( sum = 1 + 2 + ... + i )改成( sum = -1 + 2 + ... + i )

         k = 2 时可以通过把sum( sum = 1 + 2 + ... + i )改成( sum = 1 - 2 + ... + i )

         以此类推res总可以变为0


#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int n,sum,i;
while(scanf("%d",&n)==1){
sum=0;
i=0;
while(sum<n||(sum-n)%2==1)
sum+=++i;
printf("%d\n",i);
}
return 0;
}




PS:经过提醒才发现这个题和上周集训新生赛的h题青蛙跳格子 内涵是一样的(只是那题位置作为n可以为负数,因为可以向两个方向跳~)。上次写的代码也比较乱。

0 0
原创粉丝点击