poj 2231 Moo Volume

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的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).

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.

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值