Language:
Moo Volume
Time Limit: 1000MS | | Memory Limit: 65536K | Total Submissions: 18725 | | Accepted: 5564 |
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.
/*
* *project:2231 Moo Volume
* *version:AC
* *author:骨灰在飞扬
* *Time:110Ms
* *Memory:536K
* *Note:VC中不支持long long int
* 如果采用暴搜,时间复杂度为O(n^2)
* 测试数据量非常大,会TLE
* 通过寻找规律,可以将时间复杂度降为O(n)
*/
/*
* 数学公式推导
* 先排序
* A1 A2 A3 A4 A5
* 1 2 3 4 5
* D1 D2 D3 D4 D5 (含义很显然)
* 0 1 2 3 4
* 1 0 1 2 3
* 2 1 0 1 2
* 3 2 1 0 1
* 4 3 2 1 0
* 是个对称矩阵,将所有的值加起来就是最终答案
* 假设A2-A1 = D1, A3-A2 = D2...
* 考虑矩阵的下三角
* A1: volume = 4D1+3D2+2D3+D4
* A2: volume = 3D2+2D3+D4
* ...
* A4: volume = D4
* 最后将所有结点的volume加起来再乘以2就是最后的结果
*/
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
long long int location[10010]; /* cow location */
long long int volume[10010]; /* record every cow's volume */
long long int volumeTotal; /* total volume */
long long int D[10010]; /* record distance */
int main()
{
/* ifstream fin("E:\\vcpp\\test.txt"); */
int N;
cin >> N;
int i, j;
for ( i = 1; i <= N; i++ ) /* Enter cow location */
cin >> location[i];
sort( location + 1, location + N + 1 );
for ( i = 1; i < N; i++ ) /* Calculate the distance{d(i)-d(i-1)} */
{
D[i] = location[i + 1] - location[i];
}
for ( i = N - 1, j = 1; i >= 1; i--, j++ )
{
volume[j] = volume[j - 1] + j * D[i];
volumeTotal += volume[j];
}
cout << volumeTotal * 2 << endl;
system( "pause" );
return(0);
}
|