Moo Volume
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 19015 | Accepted: 5654 |
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.
农夫约翰已经收到来自他的邻居,农民鲍勃的一宗噪音投诉,说他的奶牛制造了太多的噪音。
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.
FJ的N头奶牛(1<= N<=10,000)在一个直线上的不同位置吃草。。。奶牛是非常健谈的动物。同一时间每对奶牛都在对话(所以每头牛同时Mooing所有的N-1个其他牛)。当牛i Moos牛j,这MOO音量必须等于i和j之间的距离,这样j才能够听到MOO声。请帮助FJ计算所有N *(N-1)同时Mooing会产生的总音量。
Input
* Line 1: N
* Lines 2..N+1: The location of each cow (in the range 0..1,000,000,000).
* 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.
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.
Source
这道题比较简单,排个序然后列个算式ans += (n - i - 1) * (loca[n - i - 1] - loca[i]);就出来了。。。算式还是比较明显的,手写一写就出来了。。至于为什么要排序,因为排序后才能获得正确的位置关系,不然会有一个方向的问题。。。
#include <iostream>
#include<algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
void qsort(int p, int r);
int partition_q(int p, int r);
long long loca[11111];
int main()
{
int n, i;
long long ans;
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(scanf("%d", &n)!= EOF){
for (i = 0;i < n;i ++){
scanf("%lld", &loca[i]);
}
qsort(0, n - 1);
// for (i = 0;i < n;i ++)
// printf("%lld\n", loca[i]);
ans = 0;
for (i = 0;i < n;i ++){
ans += (n - i - 1) * (loca[n - i - 1] - loca[i]);
}
printf("%lld\n", ans* 2);
}
return 0;
}
void qsort(int p, int r){
int q;
if (p < r){
q = partition_q(p, r);
qsort(p, q - 1);
qsort(q + 1, r);
}
}
int partition_q(int p, int r){
int i = p - 1;
int j;
long long temp;
for (j = p;j < r;j ++){
if (loca[j] < loca[r]){
i ++;
temp = loca[i]; loca[i] = loca[j]; loca[j] = temp;
}
}
temp = loca[i + 1];loca[i + 1] = loca[r];loca[r] = temp;
return i + 1;
}