YACS-202106

T5 平衡点

 

 

 

 

 分析:

 

 示例代码

 

#include<bits/stdc++.h>
using namespace std;
int n;
//a 输入数列数 p从第一个到当前元素之和-平衡的前面之和 
//s 从某点到最后一个数之和-平衡点后面之和 
long long a[100005],p[100005],s[100005],ans,l,r;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",a+i);
    }
    //提前计算平衡点的前面元素之和 
    for(int i=1;i<=n;i++){
        p[i]=p[i-1]+a[i];
    }
    //提前计算平衡点的后面元素之和 
    for(int i=n;i>=1;i--){
        s[i]=s[i+1]+a[i];
    }
    //计算第一个为平衡点时,平衡点后面引力 
    for(int i=2;i<=n;i++){
        r=r+(i-1)*a[i];
    }
    ans=r;//第一个为平衡点是引力最大 ans先赋值最大数 
    for(int i=1;i<n;i++){
        l=l+p[i];//计算每个平衡点左边引力-参见示例 
        r=r-s[i+1];//计算每个平衡点右边引力-参见示例 
        ans=min(ans,abs(l-r));//本次计算和最大引力差取最小 
    }
    printf("%lld",ans); 
    return 0;
}

 

posted @ 2021-06-27 09:53  new-code  阅读(41)  评论(0编辑  收藏  举报