POJ 2231 Moo Volume C++版

题目链接:http://poj.org/problem?id=2231

看似简单的题目,把我WA到哭啊,强烈推介这个题目,我自己做的是后总超时。

其中如何优化自己的算法是最重要的,这也是为什么OJ系统都有时间限制的原因,

我的算法是这样的:

比如题目中的1 2 3 4 5

我们可以看见每两个之间的距离,也就是就是这个数与其他数的差,所以就想到了相加的算法,现开始因为数据类型错误还WA了几次就不说了。

最原始的代码是:

1
2
3
4
5
6
for(i=0;i<m;i++)
for(j=0;j<m;j++)
if(i!=j)
s+=(num[i]>=num[j])?(num[i]-num[j]):(num[j]-num[i]);
cout<<s<<endl;

超时没商量,我了个去哦,后来想到对于一个序列的排序,都会有重复状况,优化算法排除其中相互成对的情况,优化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
s+=(num[i]>=num[j])?(num[i]-num[j]):(num[j]-num[i]);
cout<<2*s<<endl;


```最后代码如下:

```cpp
/*Problem: 2231 User: awq123
**Memory: 296K Time: 563MS
**Language: C++ Result: Accepted
*/
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
int m,i,j,num[10002];
long long int s=0;
cin>>m;
for(i=0;i<m;i++)
scanf("%d",&num;[i]);
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
s+=abs(num[i]-num[j]);
cout<<2*s<<endl;
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
long long int m,i,s=0,num[10002];
cin>>m;
for(i=0;i<m;i++)
cin>>num[i];
sort(num,num+m);
for(i=0;i<m-1;i++)
s += (m-1-i) * (num[m-1-i] - num[i]);
cout<<s*2<<endl;
}