帮忙比较一下这两个程序的运行时间!!!!!
几乎是一样的程序,只是第二个用了vector,为什么就超时了,而没用vector的就没超时?vector影响有那么大吗?
http://acm.hdu.edu.cn/showproblem.php?pid=1024
- C/C++ code
//这是网上的代码,引用一下,不侵权吧?呵呵…………#include<iostream>using namespace std;int f[1000003];int best[2][1000003];int N, M;int a[1000003];int sum[1000003];int main() { while (scanf("%d%d", &M, &N) != EOF) { int ans = -2000000000; sum[0] = 0; for (int i = 1; i <= N; i++) { scanf("%d", &a[i]); sum[i] = sum[i - 1] + a[i]; } for (int i = 0; i <= N; i++) best[0][i] = 0; int cur = 0; for (int j = 1; j <= M; j++) { for (int i = 0; i <= j - 1; i++) best[1 - cur][i] = -2000000000; for (int i = j; i <= N; i++) { if (j == i) f[i] = sum[i]; else f[i] = max(best[cur][i - 1], f[i - 1]) + a[i]; best[1 - cur][i] = max(best[1 - cur][i - 1], f[i]); if (j == M) ans = max(ans, f[i]); } cur = 1 - cur; } printf("%d\n", ans); } return 0;}- C/C++ code
//几乎是上面的代码翻译过来的#include <iostream>#include <vector>using namespace std;int main(){ int m, n; vector<int> s; while(cin>>m>>n){ int temp, cur = 0; int ans = -2000000000; vector<int> sum(n+1,0); s.push_back(0); for(int i=1; i<=n; i++){ cin>>temp; s.push_back(temp); sum[i] = sum[i-1]+temp; } vector<int> v(n+1); vector<vector<int> > a; a.push_back(v); a.push_back(v); for(int i=1; i<=m; i++){ for(int k=0; k<i; k++) a[1-cur][k] = -2000000000; for(int j=i; j<=n; j++){ if(j==i) v[j] = sum[j]; else v[j] = max(a[cur][j-1], v[j-1])+s[j]; a[1-cur][j] = max(a[1-cur][j-1], v[j]); if(i==m) ans = max(ans, v[j]); } cur = 1-cur; } cout<<ans<<endl; s.clear(); } return 0;}[解决办法]
系统处理数组比vector要快很多吧
[解决办法]
vector 就是大小"可变"的数组。
在大小变动的过程中可能需要搬动,或者复制数组中的元素。
这当然是需要花费时间的。
[解决办法]
用vector等容器肯定不及数组来得效率。vector一个包装过的动态数组,用着简单,对系统却更加繁琐。
能直接用数组肯定直接用呗。
[解决办法]
不是!!!
第二个程序超时的原因是你用了cin, cout;而不是你用了vector
改成这样就能过了
- C/C++ code
#include <iostream>#include <vector>using namespace std;int main(){ int m, n; vector<int> s; while(EOF != scanf("%d %d", &m, &n)) { int temp, cur = 0; int ans = -2000000000; vector<int> sum(n+1,0); s.push_back(0); for(int i=1; i<=n; i++) { scanf("%d", &temp); s.push_back(temp); sum[i] = sum[i-1]+temp; } vector<int> v(n+1); vector<vector<int> > a; a.push_back(v); a.push_back(v); for(int i=1; i<=m; i++) { for(int k=0; k<i; k++) a[1-cur][k] = -2000000000; for(int j=i; j<=n; j++) { if(j==i) v[j] = sum[j]; else v[j] = max(a[cur][j-1], v[j-1])+s[j]; a[1-cur][j] = max(a[1-cur][j-1], v[j]); if(i==m) ans = max(ans, v[j]); } cur = 1-cur; } printf("%d\n", ans); s.clear(); } return 0;}
[解决办法]
在最不利的情况下,cin,cout与scanf,printf的效率可以会相差10倍左右
vector与普通的一维数组的效率一般只相差5%左右(前提是vector用得好)
非一维数组的效率差别可能会大一点
因为多维普通数组在内存中是连续存储的,而vector模拟的多维数组却不是连续存储的
以前看过一篇文章是这样说的,
至于是否正确,我就没有认真研究过了
[解决办法]
在最不利的情况下,cin,cout与scanf,printf的效率可以会相差10倍左右
可能会相差10倍左右