• 洛谷P1155 双栈排序(贪心)


    题意

    题目链接

    Sol

    首先不难想到一种贪心策略:能弹则弹,优先放A

    然后xjb写了写发现只有(40),原因是存在需要决策的情况

    比如

    (A = {10})

    (B = {8})

    现在进来一个(7),看上去很难判断(7)到底放在哪里,如果放(A),后面来个(9),再来个(6),我们就凉了。

    但是如果先来的是(6),且此时已经排完了(1-5),那么我们可以在后续操作中把(7)弄走

    仔细想想不难发现,(7)不能放在(A)中,当且仅当存在一个位置(K),满足(a[k]>7),且在(k)之后有位置(l),满足(a[l]<7)

    也就是说(i, j, k)不能同时在栈中,当且仅当

    (i < j < k)(a[k] < a[i] < a[j])

    然后就做完了,xjb贪即可

    // luogu-judger-enable-o2
    #include<bits/stdc++.h>
    #define NO {puts("0"); exit(0);}
    #define pb(x) push_back(x) 
    using namespace std;
    const int MAXN = 1001;
    inline int read() {
        char c = getchar(); int x = 0, f = 1;
        while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int N, a[MAXN], s1[MAXN], tp1, s2[MAXN], tp2;
    vector<char> v; 
    bool check(int pos) {
        if(!tp1) return 1;
        int i, j;
        if(a[pos] > s1[tp1]) return 0;
        if(!tp2) return 1;
        for(i = pos + 1; i <= N; i++) if(a[i] > a[pos] && a[i] > s2[tp2]) break;
        for(int j = i + 1; j <= N; j++) if(a[j] < a[pos]) return 0;
        return 1;
    }
    int main() {
        N = read();
        for(int i = 1; i <= N; i++) a[i] = read();
        int now = 1;
        for(int i = 1; i <= N + 1; i++) {
            if(a[i] == now) {now++;  v.pb('a'); v.pb('b'); continue;}
            while(now == s1[tp1] || now == s2[tp2]) {
                if(now == s1[tp1]) v.pb('b'), tp1--, now++;
                if(now == s2[tp2]) v.pb('d'), tp2--, now++;
            }
            if(i == N + 1) break;
            if(check(i)) {v.pb('a'); s1[++tp1] = a[i]; continue;}
            if(!tp2 || a[i] < s2[tp2]) {v.pb('c'); s2[++tp2] = a[i]; continue;}
            NO;
        }
        if(tp1 || tp2) NO;
        for(int i = 0; i < v.size(); i++) putchar(v[i]), putchar(' ');
        return 0;
    }
    
    
  • 相关阅读:
    SSM中shiro的基本使用
    TortoiseGit小乌龟 git管理工具
    vux用法
    vue webpack打包
    vue2.0 watch
    vue2.0 $emit $on组件通信
    简单工具 & 杂技
    html基础问题总结
    Node应用进程管理器pm2的使用
    node express 登录拦截器 request接口请求
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9861358.html
Copyright © 2020-2023  润新知