| 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做差得到偶数即可。

博客介绍了一道AC题的解法。该题若需输出可行序列是背包问题,但本题无需输出序列。对于构造的sum序列,将一个“+”变为“-”会减少一个偶数,只需从n开始向后判断与题目给定的n做差是否为偶数。
516

被折叠的 条评论
为什么被折叠?



