POJ 2231 Moo Volume解题报告

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);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值