Atcoder 080 E

来源:互联网 发布:程序员客栈 编辑:程序博客网 时间:2024/06/06 02:34
#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
(感觉介绍的还挺清楚的)
接下来附上自己的代码(希望以后自己能够弄清楚这个问题):
原创粉丝点击