题意:给出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;
}
#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;
}