uva10025 The ? 1 ? 2 ? ... ? n = k problem

来源:互联网 发布:大数据特征 5v 编辑:程序博客网 时间:2024/06/07 08:31

10025 The ? 1 ? 2 ? … ? n = k problem
Given the following formula, one can set operators ‘+’ or ‘-’ instead of each ‘?’, in order to obtain a given k ?1?2?…?n = k
For example: to obtain k = 12, the expression to be used will be:
- 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12
with n = 7
Input
The first line is the number of test cases, followed by a blank line. Each test case of the input contains an integer k (0 ≤|k|≤ 1000000000). Each test case will be separated by a single line.
Output For each test case, your program should print the minimal possible n (1 ≤ n) to obtain k with the above formula. Print a blank line between the outputs for two consecutive test cases.
Sample Input
2
12
-3646397
Sample Output
7
2701
首先预处理下,然后找到题目给出的计算结果位于的区间,由于数列中使用减号可以组合出任意的偶数,所以就查找与答案差的值为偶数的最小的那个数

#include<iostream>#include<algorithm>#include<map>#include<cstdio>#include<cstdlib>#include<vector>#include<cmath>#include<cstring>#include<string>using namespace std;const int maxn=54723;typedef long long LL;LL sum[maxn];void work(LL n){    if(n==0){printf("3\n");return ;}    if(n<0)n=-n;    int high=lower_bound(sum,sum+maxn,n)-sum;    int ans=high;    while((sum[ans]-n)%2!=0)ans++;    printf("%d\n",ans);}int main(){//    #ifndef ONLINE_JUDGE//    freopen("Text//in.txt","r",stdin);//    #endif // ONLINE_JUDGE    sum[0]=0;    for(int i=1;i<maxn;i++){        sum[i]=sum[i-1]+(LL)i;    }    int T;    scanf("%d",&T);    while(T--){        LL n;        scanf("%lld",&n);        work(n);        if(T>0)puts("");    }    return 0;}/*Sample Input212-3646397Sample Output72701*/
0 0