Sum |
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB |
Total submit users: 1451, Accepted users: 1296 |
Problem 10052 : No special judgement |
Problem 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 |
Judge Tips |
The sum 12 can be obtained from at least 7 terms in the following way: 12 = -1+2+3+4+5+6-7. |
Problem Source |
ROI 2002 |
AC:
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int i = floor(-1 + sqrt(1 + 8 * n)) / 2, sum = i * (1 + i) / 2;
for (;;)
{
if (sum >= n && !((sum - n) & 1))
{
printf("%d", i);
break;
}
sum += (++i);
}
return 0;
}
这个题还是比较巧妙的,如果需要输出可行的序列,就是一个背包问题了,但是这个题,并不需要输出序列,对于构造的sum序列,每次将一个+变为-,就会减少一个偶数(在原来的值上减去两倍的变符号的值)。所以整体上只需要从n开始向后判断是否和题目给定的n做差得到偶数即可。