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

原创 2016年08月29日 18:51:18

简易版之最短距离

点我跳转到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\n",sum);
    }
    return 0;
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU2020 绝对值排序【入门】

绝对值排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub...
  • tigerisland45
  • tigerisland45
  • 2016年06月30日 16:58
  • 1798

hdu-绝对值排序

http://acm.hdu.edu.cn/showproblem.php?pid=2020 Problem Description 输入n(n   Input 输入数据有多组,每组...
  • u010368749
  • u010368749
  • 2013年07月31日 11:53
  • 676

[hdu 2020] 绝对值排序

绝对值排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm...
  • u011506951
  • u011506951
  • 2014年04月10日 11:45
  • 1092

【杭电oj2020】绝对值排序

绝对值排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...
  • better_space
  • better_space
  • 2016年08月12日 23:37
  • 390

【杭电oj】2083 - 简易版之最短距离(最短距离)

简易版之最短距离 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...
  • wyg1997
  • wyg1997
  • 2016年04月02日 19:13
  • 403

hdu 2083

简易版之最短距离 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...
  • ysc504
  • ysc504
  • 2012年12月24日 10:10
  • 1010

数据库按中间值排序

//conpay值为0,1,2$nde=M('form'); $form=$nde->order('decode(conpay,1)')->select();
  • u014152602
  • u014152602
  • 2015年12月08日 18:01
  • 167

[经典面试题]排序数组中绝对值最小元素

【题目】 题目为: 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n))...
  • SunnyYoona
  • SunnyYoona
  • 2015年01月29日 20:06
  • 2092

【入门】绝对值排序 【排序】

题目描述 输入n(n 输入 输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。 输出 对于每个测试实例,输出排序后的结...
  • Erick_Who
  • Erick_Who
  • 2015年03月02日 19:52
  • 1736

杭电ACM 2020:绝对值排序

原创作品 转载请注明出处 http://blog.csdn.net/always2015/article/details/45484481这个问题主要难点在于排序,排序有好多种算法,在一般情况下使用快...
  • Always2015
  • Always2015
  • 2015年05月04日 18:54
  • 726
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 2083(排序+绝对值+中间值求和)
举报原因:
原因补充:

(最多只允许输入30个字)