zoukankan      html  css  js  c++  java
  • HDU3434数学题

    纯粹的数学题,题目的意思是给你一组序列,让你能同时改变它的一个子序列,让其子序列的值增加1,或者减少1.

    思路的话,就是找其中的数学规律,给你的序列例如是:3,5,1,4,7。先求出其序列的正差和=5-3+7-4=5;所以可以用最小的5步消除其差距。至于为什么嘛?直接用笔思考一下就可以办到了,再者,其不同的结果数是序列的头尾的差值的绝对值加1,这里要注意,并不是序列其中的最大值与最小值的差值。因为好比上面的那个序列。是不可能出现2,2,2,2,2这种情况的,因为要达到这种情况,那么改变的步数一定是超过5步的。因为如果改变之后序列中元素的值小于头尾其中的一个数,那么就不可能通过改变一段子序列的值来变换啦。我的语言表达能力有点差,sorry!

    #include<iostream>
    #include<cstring>
    using namespace
    std;
    int
    seq[1000009];
    int
    main(void)
    {

        int
    count=0,n,m,total,i;
        _int64 first,second,ans;
        cin>>n;
        while
    (n--)
        {

            cin>>m;
            int
    max=0xFFFFFFFF,min=0x7FFFFFFF;
            for
    (i=0;i<m;i++)
                cin>>seq[i];
           
        //    cout<<max<<min<<endl;
            first=0,second=0;
            for
    (i=1;i<m;i++)
            {

                if
    (seq[i]-seq[i-1]>0)
                    first+=seq[i]-seq[i-1];
                else

                    second-=seq[i]-seq[i-1];
            }

            if
    (first>second)
                ans=first;
            else

                ans=second;
       
            if
    (seq[0]>seq[i-1])
            {

                min=seq[i-1];
                max=seq[0];
            }

            else

            {

                max=seq[i-1];
                min=seq[0];
            }

            //cout<<max<<"   "<<min<<endl;
            total=max-min+1;//求出头尾序列的差值并加1,为最终结果的总数
            /*cout<<"Case "<<++count<<": ";
            cout<<ans<<" "<<total<<endl;*/

            printf("Case %d: %I64d %d\n",++count,ans,total);
        }

        return
    0;
    }

  • 相关阅读:
    体验js之美第八课-面向对象创建和继承终结篇
    从零到一:用Phaser.js写意地开发小游戏(Chapter 3
    HTML5 进阶系列:拖放 API 实现拖放排序
    五款轻量型bug管理工具横向测评
    用原生js写一个"多动症"的简历
    HTML5中新增Javascript特性
    Angular2入门系列(五)———— 路由参数设置
    移动端真机调试实战经验
    Java经典习题44
    Java经典习题43
  • 原文地址:https://www.cnblogs.com/cchun/p/2520091.html
Copyright © 2011-2022 走看看