首页 > 代码库 > poj 2231 Moo Volume
poj 2231 Moo Volume
题意:
给定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; }
poj 2231 Moo Volume
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。