http://poj.org/problem?id=1844
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29256#problem/D
D - Sum
Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64uSubmit Status Practice POJ 1844
Description
Consider the natural numbers from 1 to N. By associating to each number a sign (+ or -) and calculating the value of this expression we obtain a sum S. The problem is to determine for a given sum S the minimum number N for which we can obtain S by associating signs for all numbers between 1 to N.
For a given S, find out the minimum value N in order to obtain S according to the conditions of the problem.
Input
The only line contains in the first line a positive integer S (0< S <= 100000) which represents the sum to be obtained.
Output
The output will contain the minimum number N for which the sum S can be obtained.
Sample Input
12
Sample Output
7
Hint
The sum 12 can be obtained from at least 7 terms in the following way: 12 = -1+2+3+4+5+6-7.
/*
164 KB 16 ms C++ 347 B
解析:
题意:
给出s,,求最小的N,s=1......N,中间的加减号是是任意的
思路:
先做加法再做减法。
1.求从1开始枚举,求等差数列和si,直到si》=s
2然后往后枚举数列和,并判断(si-s)%2==0是否为偶数
如果是则说明找到结果i.
为什么可以这样计算呢?
因为开始做加法计算,如果存在减号,那么结果只差必然是偶数例如;
S4=1+2+3+4;
S4’=1-2+3+4;
S4-s4’=4;
*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
using namespace std;
int main()
{
int s,n,i;
while(scanf("%d",&s)!=EOF)
{
i=1;
int t=1;
while(t<s)
{i++;
t=((1+i)*i)/2;
}
n=i;
for(i=n;;i++)
{
t=((1+i)*i)/2;
if((s-t)%2==0)
break;
}
n=i;
printf("%d\n",n);
}
return 0;
}