標籤:dp poj 高精度
題意:
給定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 10050long 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; }
poj 2231 Moo Volume