POJ 2231

这道题是要求直线上所有两点间距离之和。但用一般的方法,时间会达到O(n^2),会TLE。可以从另一个角度考虑。
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N 10001
 4 int n;
 5 __int64 a[N];
 6 __int64 sum;
 7 int compare(const void *p,const void *q)
 8 {
 9     return (*(int *)p - *(int *)q);
10 }
11 int main()
12 {
13     int i,j;
14     while(scanf("%d",&n) != EOF){
15         for(i = 0;i < n;i++){
16             scanf("%d",&a[i]);
17         }
18         qsort(a,n,sizeof(__int64),compare);
19         sum = 0;
20         for(i = 0;i < n-1;i++){
21             sum += (n-i-1)*(i+1)*(a[i+1]-a[i]);
22         }
23         printf("%I64d\n",2*sum);
24     }
25     system("pause");
26     return 0;
27 }
这时时间是O(n)。

posted on 2009-04-13 15:22 Johnnx 阅读(412) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜