HDU 2083 简易版之最短距离

今天太无聊了,居然刷水题,不过觉得这道题挺有意义的,虽然还是很水 0 0

题意: 略(中文)

思路:

  枚举每个点到其他所有点的距离和,取最小值。

  先排序。然后求第一个点到其他点的距离和。然后向右移动,此时左边的点远离,右边的点靠近,可以O(1)的求出下一个点到其他点的距离。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int a[1000];
 8 
 9 int main() {
10     int T;
11     scanf("%d", &T);
12     while (T--) {
13         int n;
14         scanf("%d", &n);
15         for (int i = 0; i < n; i++)
16             scanf("%d", &a[i]);
17         sort(a, a+n);
18         int now = 0;
19         for (int i = 1; i < n; i++)
20             now += a[i]-a[0];
21         int ans = now;
22         for (int i = 1; i < n; i++) {
23             now += (i-n+i)*(a[i]-a[i-1]);
24             ans = min(ans, now);
25         }
26         printf("%d\n", ans);
27     }
28 
29     return 0;
30 }

 

posted @ 2014-04-04 00:55  Phantom01  阅读(169)  评论(0编辑  收藏  举报