zoukankan      html  css  js  c++  java
  • UVa10025 The ? 1 ? 2 ? ... ? n = k problem 数学思维+规律

    UVa10025

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

    The 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

    The Input

    The first line is the number of test cases, followed by a blank line.

    Each test case of the input contains integer k (0<=|k|<=1000000000).

    Each test case will be separated by a single line.

    The 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


    数学思维:
    看似复杂,情况很多种,乍一看摸不着头脑的一道题,让人心生畏惧,Don't panic
    数学思维,找规律求解
    对于0=1+2-3  3
      1=-1+2   2
      2=1-2+3  3
    依次查看,每个数的结果好像没什么规律
    再看,会发现,若1变为-1,实际上将原数-2
           2变为-2,实际上将原数-4    均为偶数,我们进步了一大步,我感觉离成功不远了,代码铁定不复杂,只需要我们想清楚
      我们持续+,直到数s>k,此时若(s-k)%2==0,说明,s可将组成s的数中的一部分变为负数来的到k
      问题转化为求满足s>k&&(s-k)%2==0的数s时,所经历的最大数

    注意输出格式!减少不必要的麻烦。

    PS:像这种基本的找规律题,数学思维,看得出就看,看不出就试
    Version2.0
    #include "cstdio"
    #include "cstring"
    #include "cstdlib"
    #include "iostream"
    #include "vector"
    #include "queue"
    using namespace std;
    int main()
    {
        int t,k,s,n;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&k);
            if(k==0)
                printf("3
    ");
            else
            {
                if(k<0)k=-k;
                s=n=0;
                while(s<k)s+=++n;
                while((s-k)&1)s+=++n;
                printf("%d
    ",n);
            }
            if(t)
                printf("
    ");
        }
    }


    Version 1.0
    #include "cstdio"
    #include "cstring"
    #include "cstdlib"
    #include "iostream"
    #include "vector"
    #include "queue"
    using namespace std;
    #define LL long long
    int main()
    {
        LL k;
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%lld",&k);
            int sum=0;
            int flag=0;
            if(k==0)
            {
                printf("3
    ");
            }
            else
            {
                if(k<0)k=-k;
                int t=1;
                while(1)
                {
                    if(sum==k)///全为+ 15
                        break;
                    else if(sum>k)
                    {
                        if((sum-k)%2==0)///-在前面 13
                            break;
                        if(sum-t==k)///-在最后
                        {
                            flag=1;
                            break;
                        }
                        else if(sum-t>k)
                        {
                            if((sum-t-k)%2==0)///-前后均有  12
                            {
                                flag=1;
                                break;
                            }
                        }
                    }
                    sum+=t;
                    t++;
                }
                if(flag)t++;
                printf("%d
    ",--t);
            }
            if(T)printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    innobackupex备份命令输出
    Percona XtraBackup原理详解
    MongoDB性能分析工具mongostat
    MongoDB查看当前连接数
    事务、拦截器
    HttpServletResponse和HttpServletRequest的简单实用
    Maven环境配置
    SQL Server 时间戳与时间格式互相转换
    虚拟机、云主机、VPS 三者之间的区别
    Elasticsearch 空值过滤
  • 原文地址:https://www.cnblogs.com/kimsimple/p/6701904.html
Copyright © 2011-2022 走看看