您的位置:首页 > 其它

ACM: 简单排序题 poj 2231 动动脑…

2016-05-19 23:23 197 查看
Moo Volume

Description
Farmer John has
received a noise complaint from his neighbor, Farmer Bob, stating
that his cows are making too much noise.

FJ's N cows (1 <= N <= 10,000) all
graze at various locations on a long one-dimensional pasture. The
cows are very chatty animals. Every pair of cows simultaneously
carries on a conversation (so every cow is simultaneously MOOing at
all of the N-1 other cows). When cow i MOOs at cow j, the volume of
this MOO must be equal to the distance between i and j, in order
for j to be able to hear the MOO at all. Please help FJ compute the
total volume of sound being generated by all N*(N-1) simultaneous
MOOing sessions.
Input

* Line 1: N

* Lines 2..N+1: The location of each cow (in the range
0..1,000,000,000).
Output

There are five cows
at locations 1, 5, 3, 2, and 4.
Sample Input

5

1
5
3
2
4

Sample Output

40

Hint

INPUT DETAILS:

There are five cows at locations 1, 5, 3, 2, and 4.

OUTPUT DETAILS:

Cow at 1 contributes 1+2+3+4=10, cow at 5 contributes 4+3+2+1=10,
cow at 3 contributes 2+1+1+2=6, cow at 2 contributes 1+1+2+3=7, and
cow at 4 contributes 3+2+1+1=7. The total volume is (10+10+6+7+7) =
40.

题意: 计算出sum =  ∑(a[i] - a[j]);

解题思路:

               
1. 题目给10,000个点, O(n^2)的暴力方法不可取.

               
2. 只需要仔细观察,先排序,每项与其下一项的作用,(重复使用的次数).

               
问题分析:

               
假设现在数组排序后: — — ... — T— — — ... —

                                                        
K个
             
n-1-K个

               
每项a[i+1] - a[i]项会用到的次数是 (n-1-K)*(K+1)*(a[i+1]-a[i]);

代码:

#include <cstdio>

#include <iostream>

#include <cstring>

#include <cstdlib>

using namespace std;

#define MAX 10005

int n;

long long a[MAX];

long long sum;

int cmp(const void *a,const void *b)

{

    return
(*(int*)a) - (*(int*)b);

}

int main()

{

//   
freopen("input.txt","r",stdin);

   
while(scanf("%d",&n) != EOF)

    {

   
    for(int i =
0; i < n; ++i)

   
   
   
scanf("%lld",&a[i]);

   
   
   

   
   
qsort(a,n,sizeof(a[0]),cmp);

   
    sum =
0;

   
    for(int i =
0; i < n-1; ++i)

   
    {

   
   
    sum +=
(a[i+1]-a[i])*(n-i-1)*(i+1);

   
    }

   
   

   
   
printf("%lld\n",sum*2);

    }

    return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: