#include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int> ans; int n; const int INF = 0x3f3f3f; void solve(vector<int> dir,int f,int s) { if (dir.empty()) return; int maxhead = 0, cnt = 0,down; for (int i = 0; i < dir.size()-1; ++i) { if (dir[i] != f && dir[i] != s) { if (dir[i + 1] != f && dir[i + 1] != s) { if (dir[i] > maxhead) { cout << "ok" << endl; cout << i << endl; maxhead = dir[i]; down = i; } } } } cout << down << endl; ans.push_back(dir[down + 1]); ans.push_back(dir[down]); vector<int> nex; for (int i = 0; i < dir.size(); ++i) { if (i != down && i!=down+1) { nex.push_back(dir[i]); } } solve(nex, f, s); } int main() { vector<int> iv; int temp,goalf=INF,goals=INF; cin >> n; for (int i = 0; i < n; ++i) { cin >> temp; iv.push_back(temp); if (temp < goalf && !(i%2)) { goalf = temp; } } int i; for (i = 0; iv[i] != goalf; ++i); for (int j = i + 1; j < n; ++j) { if (iv[j] < goals) { goals = iv[j]; } } cout << goalf << " " << goals << endl; solve(iv,goalf,goals); reverse(ans.begin(), ans.end()); for (int i = 0; i < ans.size(); ++i) { cout << ans[i] << " "; } cout << endl; system("pause"); return 0; }
这道题自己原来想出来一个解法,但很遗憾有几点错误。
1.编译不通过,显示我的down没有初始化(但是我用的测试数据真的显示我的if()进去了啊)!
2.思维确实还不够严密,第二个数必须是在第一个数之后而且在整个数组中应该是在偶数位(从1开始)
参考了别人的题解,说是要用线段树,于是自学了一下线段树:
http://www.cnblogs.com/TenosDoIt/p/3453089.html
(感觉介绍的还挺清楚的)
接下来附上自己的代码(希望以后自己能够弄清楚这个问题):