UVA - 514:Rails
題目鏈接:https://vjudge.net/problem/UVA-514
題目分析
題目的意思是給一個棧輸入一系列數據,在這個過程中可以出棧,看能否達到某個結果。
剛開始我覺得這個情況好多,因此不是用模擬,而應該觀察結果本身。對于結果中某個元素x,比他小的元素肯定已經入過棧了,此時可能有兩種去處:
對于1.,只能說它比x 小而且在x的前面,除此之外沒有其他約束了。
對于2.,那些比x小的元素在結果中的位置肯定在x的后面,而且肯定是逆序排列。因為只能進棧一次,而他們是從小到大進棧的,必然是從大到小出棧的。如果不符合這個條件肯定就是非法情況。
我的思路就是檢查每個元素后面比他小的元素是否是逆序的,復雜度是O(n2)O(n^2)O(n2)
UVa里面有時候要求最后有換行,有時候又要求不能有空行,真是讓人摸不著頭腦。。
AC代碼
#include <iostream> #include <vector> #include <deque>using namespace std;int n; vector<int> arr;bool check_idx(int idx) {int x = arr[idx];int minx = x;for (int i = idx + 1; i < n; ++i) {if (arr[i] < x) {if (arr[i] > minx) return false;minx = arr[i];}}return true; }bool check() {for (int i = 0; i < n; ++i) {if (!check_idx(i)) return false;}return true; }bool first = true;int main() {ios::sync_with_stdio(false);while (cin >> n && n != 0) { // if (first) first = false; // else cout << "\n";arr.resize(n);while (cin >> arr[0] && arr[0] != 0) {for (int i = 1; i < n; ++i) cin >> arr[i];if (check()) cout << "Yes\n";else cout << "No\n";}cout << "\n";}return 0; }更好的思路
看了一下書上了代碼(書上的代碼真的丑,寫出這么晦澀的代碼也是很厲害的),發現是可以進行模擬的,而且復雜度是O(n)O(n)O(n),如果題目有心刁難我上面的解法可能就會TLE。
模擬的思路就是,剛開始肯定是按照從小到大的元素進棧,如果我們結果中當前元素直接是這個入棧的元素,那么再直接出棧,否則就丟在棧里。如果不是當前入棧元素,那么就和棧頂的元素比較,如果也不是,那就先入棧,看看后面的元素還有沒有希望,如果所有元素都已經入棧了,那就沒希望了,直接GG。
AC代碼
#include <iostream> #include <vector> #include <deque>using namespace std;int n; deque<int> s; vector<int> arr;bool check() {int x = 1;for (int i = 0; i < n; ++i) {if (arr[i] == x) {++x;continue;}if (!s.empty()) {if (s.back() == arr[i]) {s.pop_back();continue;} else if (s.back() > arr[i]) {return false;}} // if (x > arr[i]) return false;if (x < n) {s.push_back(x++);--i;} else {return false;}}return true; }int main() {ios::sync_with_stdio(false);while (cin >> n && n != 0) {arr.resize(n);while (cin >> arr[0] && arr[0] != 0) {s.clear();for (int i = 1; i < n; ++i) cin >> arr[i];if (check()) cout << "Yes\n";else cout << "No\n";}cout << "\n";} }感覺這道題的數據很弱,我剛才把s.clear()寫到循環外面去了都AC了。。
添加了一個優化語句:當棧頂元素比結果中的當前元素大時直接不可達,原因是后面的元素肯定都比棧頂元素大。
總結
以上是生活随笔為你收集整理的UVA - 514:Rails的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA - 210:Concurrenc
- 下一篇: 我想买个皮肤 请问EZ的未来战士和金克斯