• HDU 2083(排序+绝对值+中间值求和)


    简易版之最短距离

    点我跳转到HDOJ

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 16700 Accepted Submission(s): 7481

    Problem Description

    寒假的时候,ACBOY要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上。ACBOY可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点,然后才能去访问下一个朋友。
    比如有4个朋友,对应的X轴坐标分别为1, 2, 3, 4。当ACBOY选择坐标为2的点做为出发点时,则他最终需要的时间为 |1-2|+|2-2|+|3-2|+|4-2| = 4。
    现在给出N个朋友的坐标,那么ACBOY应该怎么走才会花费时间最少呢?

    Input

    输入首先是一个正整数M,表示M个测试实例。每个实例的输入有2行,首先是一个正整数N(N <= 500),表示有N个朋友,下一行是N个正整数,表示具体的坐标(所有数据均<=10000).

    Output

    对于每一个测试实例,请输出访问完所有朋友所花的最少时间,每个实例的输出占一行。

    Sample Input

    2
    2
    2 4
    3
    2 4 6

    Sample Output

    2
    4

    题意简述

    本题题意直接明了,不必重复了

    题意分析

    既然想用时最短,那么肯定要以某个特定的朋友开始。一开始输入的数据不一定是有序的,所以应该先对数组进行排序。
    排好序,接下来我们想一下,如果从两边分别开始逐个进行拜访,那么这样用时肯定是最长的,并且时间相等(可以看成每个数字差的绝对值的和,就不给出证明了)。所以可以想到,从中间开始,作为起点,然后向两边进行拜访,这样的时间肯定是最短的(代码实现的时候,只需要找到中间的数,然后从最左边开始遍历求和就行了,不需要从中间开始,分别向左向右求和,这样代码不好实现,也麻烦)。
    好了,几本思路形成了,我们注意几个数学问题(数学好的就skip吧)!!

    ①如果数组单元个数分奇偶,影响找到中间值和结果吗?
    Answer:不影响

    0 1 2
    2 5 10

    这样一组数据,中间值a[mid] = 5
    time(min) = 3+5=8

    0 1 2 3
    2 5 10 15

    有人有疑问了:
    mid = m/2 还是 (m-1) / 2 呢?
    此时a[mid] = 5或10 那我们分别计算下此时的time(min)
    为5的时候time = 3+5+10
    为10的时候time = 8+5+5 均为18
    所以可以得出结论不影响,证明也很简单,在这里就不赘述了。

    ②用sort函数报错咋办?
    那首先看你下你的文件是不是.cpp,其次看看头文件有没有algorithm,最后看看有没有using namespace std;
    (我就忘了+)

    代码总览

    /*
        Title:HDU 2083
        Author:pengwill
        Date:2016-08-29
        Blog:http://blog.csdn.net/pengwill97
    
    */
    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int main()
    {
        int n;
        int a[501];
        scanf("%d",&n);
        while(n--){
            int m,i,mid,sum;
            scanf("%d",&m);
            for(i = 0; i<m;i++){
                scanf("%d",&a[i]);
            }
            sort(a,a+m);
            mid = m/2;
            sum = 0;
            for(i = 0; i<m;i++){
                if(i == mid){
                    continue;
                }else{
                    sum += abs(a[mid]-a[i]);
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    } 
  • 相关阅读:
    【转载】比较c++中的值传递,引用传递,指针传递
    【转载】在ARX中通过COM在ACAD中添加菜单和工具条
    【转载】预编译头文件phc
    jsp 连 sql server
    今天上传点关于asp的好东东
    转: [软件人生]给一个刚毕业学生朋友的建议
    世界首富比尔盖茨花钱全过程
    wap开发工具
    一名25岁的董事长给大学生的18条忠告
    今天再来点好东东,
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367278.html
Copyright © 2020-2023  润新知