poj1844

题意:给出S(S>0)位置某一个到迭代,问是否存在N使得1~N这些数字相加减(每个数字只使用一次)能得到S。

分析:1+..+N<S, 一定无法构成,N需要增加

1+..+N=S直接输出N

1+..+N>S需要把一些数字改成负的,改1则总和减少2,改2则总和减少4……用这种方式可以构成所有的0到1+..+N之间的与1+..+N差为偶数的数字。如果差小于等于N*2则可以直接通过一个数字的变号得到,如果大于N*2则先将N变号,然后迭代为N-1的子问题。一定某一个位置之后可以用一个数字的变号解决,因为一直迭代下去,变成负号的数字过多,会造成式子计算结果为负数。

所以只要总和-S为偶数即可构成,如果不是偶数则N需要增加。

View Code
#include <iostream>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
usingnamespace std;

int main()
{
//freopen("t.txt", "r", stdin);
int n;
scanf(
"%d", &n);
int sum =0;
int i =0;
while (sum < n || (sum - n) &1)
{
i
++;
sum
+= i;
}
printf(
"%d\n", i);
return0;
}
原文地址:https://www.cnblogs.com/rainydays/p/2078034.html