贪心?——Moo Volume

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.

原封不动翻译就是,n个牛站一排,每头牛更其他牛都要讲话,讲话有声音,声音大小和距离有关。问,n头牛同时和其他牛讲话时所有分贝。
读题目简单想的就简单。

我的代码,时间复杂度O(n^2),这样的复杂度是不可能过滴,以后别写了。
这么简单的思路一遍还写不对。

#include<iostream>
using namespace std;
 long long nn[10000];
int main(){
     long long n;
    cin>>n;
    memset(nn,0,n);
    for( long long i=0;i<n;i++){cin>>nn[i];}
     long long sum1=0;
    for( long long i=0;i<n;i++){
        for( long long j=0;j<n;j++){
            if(nn[j]-nn[i]>0)
                sum1+=nn[j]-nn[i];
            else
                sum1+=nn[i]-nn[j];
        }
    }
    cout<<sum1<<endl;
    return 0;
}

后来博客上有人明显优化了

long long ans=0;  
    for(int i=0;i<n;i++)  
    {  
        for(int j=0;j<i;j++)  
            ans+=nn[i]-nn[j];  
        for(int j=i+1;j<n;j++)  
            ans+=nn[j]-nn[i];  

    }

时间复杂度还不是没变。

看到居然有O(n)的时间复杂度后无语了。

long long sum=0;  
    for(int i=1;i<n;i++)  
    {         
        sum+=(a[i]-a[i-1])*i*(n-i);  
    }  

这里写图片描述

这是深刻的理解。。才这样简洁明了言简意赅。不是我写的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值