标题:如何解决这个简单的排序问题.PKU 2231 Time Limit Exceed
只看楼主
stupid_boy
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-7-6
 问题点数:0 回复次数:11 
如何解决这个简单的排序问题.PKU 2231 Time Limit Exceed
Here is the address:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2231


Moo Volume
Time Limit:1000MS Memory Limit:65536K
Total Submit:2457 Accepted:683

Description
Farmer John has received a noise complaint from his neighbor, Farmer Bob, stating that his cows are making too much noise.

FJ's N cows (1 <= N <= 10,000) all graze at various locations on a long one-dimensional pasture. The cows are very chatty animals. Every pair of cows simultaneously carries on a conversation (so every cow is simultaneously MOOing at all of the N-1 other cows). When cow i MOOs at cow j, the volume of this MOO must be equal to the distance between i and j, in order for j to be able to hear the MOO at all. Please help FJ compute the total volume of sound being generated by all N*(N-1) simultaneous MOOing sessions.

Input
* Line 1: N

* Lines 2..N+1: The location of each cow (in the range 0..1,000,000,000).

Output
There are five cows at locations 1, 5, 3, 2, and 4.

Sample Input

5
1
5
3
2
4

Sample Output

40

Hint
INPUT DETAILS:

There are five cows at locations 1, 5, 3, 2, and 4.

OUTPUT DETAILS:

Cow at 1 contributes 1+2+3+4=10, cow at 5 contributes 4+3+2+1=10, cow at 3 contributes 2+1+1+2=6, cow at 2 contributes 1+1+2+3=7, and cow at 4 contributes 3+2+1+1=7. The total volume is (10+10+6+7+7) = 40.

Source
USACO 2005 January Silver

Here is my code:

#include<iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;

double dis[10000];

int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}

int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>dis[i];
qsort(dis,n,sizeof(dis[0]),cmp);
double sum=0;
for(int t=0;t<n;t++)
for(int k=0;k<n;k++)
sum+=fabs((dis[k]-dis[t]));
cout<<sum;
return 0;
}

I get the result "Time Limit Exceed " from PKU online judge.Please tell me the detects,thanks.
I don't know how to improve my code now...I need your help.

搜索更多相关主题的帖子: Limit Exceed PKU Time 
2007-07-22 03:19
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
得分:0 

既然是TLE, 那么可以考虑改进下算法..

cows站成一行, 对任意cow来说, 其左右方向总有一定数量(0 - int((N+1)/2)的volume数值是对称的, 这部分可以不必计算....

试一下...


女侠,约吗?
2007-07-22 09:45
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
得分:0 
BTW.. 这个是排序问题吗? ...

女侠,约吗?
2007-07-22 09:47
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1026
专家分:177
注 册:2007-5-10
得分:0 

超INT32范围,阴险了一下,用cin,cout很耗时,尽量用scanf,printf
Source

Problem Id:2231 User Id:leeco
Memory:288K Time:15MS
Language:G++ Result:Accepted

Source

#include <iostream>
#include <algorithm>
using namespace std;

#define INT64 long long

int n,arr[10000];
INT64 s[10000],sum;

int main()
{
//ios::sync_with_stdio();
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
sort(arr,arr+n);
s[0]=0;
sum=0;
for(INT64 i=1;i<n;i++){
s[i]=s[i-1]+i*(arr[i]-arr[i-1]);
sum+=s[i];
}
cout<<(sum<<1)<<"\n";
}
}

2007-07-22 15:28
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1026
专家分:177
注 册:2007-5-10
得分:0 
不过你两个循环肯定超时的,这题在排序好的基础上用动态规划有线性的算法。总体O(nlgn)就可以了
2007-07-22 15:32
stupid_boy
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-7-6
得分:0 

感谢各位热心帮助.

刚刚起床....去吃点东西就来看.


失眠。。。
2007-07-22 17:59
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1026
专家分:177
注 册:2007-5-10
得分:0 
2007-07-22 18:59
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
回复:(leeco)不过你两个循环肯定超时的,这题在排序...
Haha, guys. Guess what. I cheated on the online judge and she accepted the following 1/2*N*(N-1) algorithm !!!

181b with gcc
=================================================================
2373307 hjin 2231 Accepted 76K 873MS GCC 181B 2007-07-22 21:38:11


main(){int N,i,j,c[10000];long long s;while(scanf(\"%d\",&N)!=-1){s=0ll;for(i=0;i<N;++i){scanf(\"%d\",c+i);for(j=0;j<i;++j)s+=c[i]>c[j]?c[i]-c[j]:c[j]-c[i];}s<<=1;printf(\"%I64d\n\",s);}}

[此贴子已经被作者于2007-7-22 21:49:23编辑过]


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-07-22 21:42
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1026
专家分:177
注 册:2007-5-10
得分:0 
哈你可以的。
printf("%I64d\n",s);
这样的写法是最新标准规定的?
2007-07-22 22:58
stupid_boy
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-7-6
得分:0 

我用的是VC++ .....

晕死,到现在都还没有AC...

to leeco: 我的能力还不足以参加比赛,谢谢你的好意

哪个高手有用VC写的code,弄一份来看看


失眠。。。
2007-07-22 23:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-157176-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.882651 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved