nyist_1005 Moo Volume

来源:互联网 发布:电力通信网络组网分析 编辑:程序博客网 时间:2024/06/05 14:34

题意是:给你n头牛的位置,求每头牛到其他每个牛的(位置)走的距离和。

Cow at 1 contributes 1+2+3+4=10,意思是位置1的牛到位置2,3,4,5的牛要走1,2,3,4路程。

//推导法#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long LL;int a[11000];LL b[11000];int abs(int x){return x>=0?x:-x;}int main(){    int n;    while(~scanf("%d",&n)){            memset(b,0,sizeof(b));     for(int i=1;i<=n;i++)        cin>>a[i];        sort(a+1,a+n+1);       // for(int i=1;i<=n;i++)    /*这个及以下的Pr可以输出看看*/       //  printf("%d ",a[i]);printf("\n");        int mid=n/2+1;        LL sum=0;        int temp=mid;     for(int i=1;i<=n;i++)  //首先计算出中间值     {          if(i==mid) continue;          sum+=abs(a[mid]-a[i]);     }        b[mid]=sum;//printf("b[%d]=%d\n",mid,b[mid]);        for(int i=mid-1;i>=1;i--)//向左逐个推值        {             int d=abs(a[i]-a[mid]);//第i个点和中间点的差值             b[i]=b[mid]+((n-i)-i)*d;//以第i个为界,左边有i个值(包括自身),右边n-i个值,比中间值多((n-i)-i)*d;(画图思考)             mid=i; //更新中间点使其紧挨将要推的下一个i(只有紧挨的两点上面的求值公式才对)             //printf("b[%d]=%d\n",i,b[i]);        }         mid=temp;//重回数组的中间        for(int i=mid+1;i<=n;i++) //向右逐个推值        {            int d=abs(a[i]-a[mid]);            b[i]=b[mid]+(i-1-(n-i+1))*d;//稍有不同            mid=i; //printf("b[%d]=%d\n",i,b[i]);        }        //for(int i=1;i<=n;i++)        //  printf("%d ",b[i]);cout<<endl;          sum=0;        for(int i=1;i<=n;i++)         sum+=b[i];        cout<<sum<<endl;     }return 0;}

 
//公式法#include <stdio.h>#include <algorithm>using namespace std;long long cow[10010];int main(){    long long n,i;    scanf("%lld",&n);    for(i=0;i<n;i++)        scanf("%lld",&cow[i]);    sort(cow,cow+n);    long long sum=0;    for(i=1;i<n;i++)        sum+=(cow[i]-cow[i-1])*i*(n-i)*2;    printf("%lld\n",sum);    return 0;}//ps:可以推导出来,感觉比公式好多了;

0 0
原创粉丝点击