【发布时间】:2022-01-05 00:16:13
【问题描述】:
如何加快我的程序?
我的任务:1
示例: example
我的解决方案:
#include <iostream>
#include <vector>
//#pragma GCC optimize ("O3")
using namespace std;
int n;
int num(vector<vector<int>> sets) {
int res = 0;
for (int i = 0; i < sets.size(); i++)
for (int j = 0; j < sets[i].size(); j++)
if (sets[i][j] != 0)
res++;
return res;
}
bool testSets(vector<vector<int>> sets) {
for (int i = 0; i < sets.size(); i++) {
if (sets[i].size() == 0) {
return false;
} else {
for (int j = 0; j < sets[i].size() - 1; j++)
if (sets[i][j] >= sets[i][j + 1])
return false;
}
}
if (num(sets) == n)
return true;
else
return false;
}
void out(vector<vector<int>> a) {
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a[i].size(); j++)
cout << a[i][j] << " ";
cout << endl;
}
}
void func(vector<vector<int>> sets, vector<int> a, vector<bool> used) {
if (num(sets) == n) {
if (testSets(sets)) {
out(sets);
cout << endl;
} else {
return;
}
} else {
int i, x;
for (i = 0; i < used.size(); i++) {
if (used[i] == false)
break;
}
if (i == used.size())
i--;
for (x = 0; x < sets.size(); x++) {
if (sets[x].size() == 0)
break;
}
if (x == sets.size())
x--;
used[i] = true;
for (int j = 0; j <= x; j++) {
sets[j].push_back(a[i]);
//out(sets);
func(sets, a, used);
sets[j].pop_back();
}
used[i] = false;
}
}
int main() {
int k;
cin >> n >> k;
vector<int> a(n);
vector<vector<int>> sets;
vector<bool> used(n, false);
for (int i = 0; i < a.size(); i++)
a[i] = i + 1;
sets.resize(k);
func(sets, a, used);
return 0;
}```
【问题讨论】:
-
你分析了吗?它大部分时间都在哪里度过?
-
在
func的开头调用num,它每次都会遍历所有元素。这似乎是个坏主意。 -
@TedLyngmo 不,我无法进行测试,而且我想不出能让她长时间工作的测试。所以我不知道它什么时候运行缓慢,但我现在,在某些测试中它太慢了
-
@taburetca 你在到处传递
std::vector的值。您应该通过引用或 const 引用而不是值来传递它们。第二件事与您的帖子有关 - 在此处发布数据,而不是在外部网站上,也不是作为图像。
标签: c++ performance optimization micro-optimization