日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA - 514:Rails

發布時間:2023/11/30 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。