POJ 2231 Moo Volume

来源:互联网 发布:wifi网络嗅探器破解版 编辑:程序博客网 时间:2024/06/05 16:27
Moo Volume
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 21304 Accepted: 6434

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

515324

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.

输入数轴上的n个不同的数,分别表示n个坐标,现在要求每个坐标分别到其他n-1个坐标的距离和的和。假如有4 个坐标 1 2 3 4 则1到 2 3 4 的距离分别为 1 2  3 ,2到1 3 4 的距离分别为 1 1 2,3到1 2 4的距离分别为2 1 1,4到1 2 3 的距离分别为3 2 1.所以总的距离为20。

输入:第一行为1<=n<=10000,表示以下有n行,每行代表一个0到1,000,000,000大小的坐标。

输出:题意所求的距离和。

不可以暴力,会超时
排序之后,对于每一组相邻的差a[pos]-a[pos-1],当i取0-(pos-1)以及j取pos-n时,i和j之间的差值必然包括a[pos]-a[pos-1]。

那么a[pos]-a[pos-1]出现的次数是i*(n-i)


#include <cstdio>#include <algorithm>using namespace std;const int maxn = 10000 + 10;typedef long long ll;int n;int a[maxn];ll ans;int main(){    while (scanf("%d", &n) != EOF){        for (int i = 0; i < n; i++){            scanf("%d", &a[i]);        }        sort(a, a + n);        ans = 0;        for (int i = 1; i < n; i++){            ans += (ll)(a[i] - a[i - 1]) * i * (n - i);        }        printf("%lld\n", ans * 2);    }    return 0;}


0 0
原创粉丝点击