题意:
给定n个数字。
问随意两数之间的差的总和是多少。
思路:
先从小到大排序。
然后dp转移方程:
sum[i]=sum[i-1] + i*(sum[i]-sum[i-1]);
最后结果是ans=sum[n]*2;(由于噪声计算是双向的)
事实上与其说是dp,还不如说是找规律。
这种时间复杂度是sort的时间复杂度O(nlogn)。
主要卡精度。
。。
。
法一:
#include<stdio.h>
#include<stdlib.h>
#define MAX_COW 10050
long long sum[MAX_COW],cow[MAX_COW],ans=0;
int cmp(const void *a,const void *b)
{return *(long long *)a-*(long long *)b;}
int main()
{
int i,n;
sum[0]=0;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%lld",&cow[i]);
qsort(cow,n,sizeof(cow[0]),cmp);
for(i=1;i<n;i++)
{
sum[i]=sum[i-1]+(cow[i]-cow[i-1])*i;
ans+=sum[i];
}
printf("%lld\n",ans*2);
}
return 0;
}
法二:
#include<stdio.h>
#include<stdlib.h>
#define MAX_COW 10050
__int64 sum[MAX_COW],cow[MAX_COW],ans=0;
int cmp(const void *a,const void *b)
{return *(__int64 *)a-*(__int64 *)b;}
int main()
{
int i,n;
sum[0]=0;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%I64d",&cow[i]);
qsort(cow,n,sizeof(cow[0]),cmp);
for(i=1;i<n;i++)
{
sum[i]=sum[i-1]+(cow[i]-cow[i-1])*i;
ans+=sum[i];
}
printf("%I64d\n",ans*2);
}
return 0;
}