zoukankan      html  css  js  c++  java
  • 洛谷 P1155 双栈排序

    题目传送门

    解题思路:

    首先考虑只有一个栈的时候如何解决这个问题。

    就是对于一对位置 (i, j)是否能共存三个位置 i<j<k 存在pk<pi<pj 是不可行的,因为pk 需要在 pi 与pj 之前出栈,但 pi 又需要在 pj 之前出栈,那么这就会产生矛盾。

    我们就将i和j连一条边,如果找到一对i和j不能连边,构不成二分图,输出0;否则贪心模拟做题过程.

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<queue>
     5 #include<vector>
     6 #include<stack>
     7 #include<cstdlib>
     8 #define INF 0x7f7f7f7f
     9 
    10 using namespace std;
    11 
    12 int n,a[1005],f[1005],color[1005];
    13 vector<int> e[1005];
    14 stack<int> s1,s2;
    15 
    16 inline void bfs(int s) {
    17     queue<int> q;
    18     q.push(s);
    19     color[s] = 1;
    20     while(!q.empty()) {
    21         int now = q.front();
    22         for(int i = 0;i < e[now].size(); i++) {
    23             int next = e[now][i];
    24             if(color[next] == -1) {
    25                 color[next]= color[now] ^ 1;
    26                 q.push(next); 
    27             }
    28             else if(color[next] != (color[now] ^ 1)) {
    29                 printf("0");
    30                 exit(0);
    31                 return ; 
    32             }
    33         }
    34         q.pop();
    35     }
    36 }
    37 
    38 int main()
    39 { 
    40     memset(color,-1,sizeof(color));
    41     scanf("%d",&n);
    42     for(int i = 1;i <= n; i++) 
    43         scanf("%d",&a[i]);
    44     f[n+1] = INF;
    45     for(int i = n;i >= 1; i--) 
    46         f[i] = min(f[i+1],a[i]);
    47     for(int i = 1;i <= n; i++)
    48         for(int j = i + 1;j <= n; j++)
    49             if(a[i] > f[j+1] && a[i] < a[j])
    50                 e[i].push_back(j),e[j].push_back(i);
    51     for(int i = 1;i <= n; i++)
    52         if(color[i] == -1)
    53             bfs(i);
    54     int cnt = 1;
    55     for(int i = 1;i <= n; i++) {
    56         if(color[i] == 1) {
    57             s1.push(a[i]);
    58             printf("a ");
    59         }
    60         else {
    61             s2.push(a[i]);
    62             printf("c ");
    63         }
    64         while((!s1.empty() && s1.top() == cnt) || (!s2.empty() && s2.top() == cnt)) {
    65             if(!s1.empty() && s1.top() == cnt) {
    66                 s1.pop();
    67                 printf("b ");
    68             }
    69             else  {
    70                 s2.pop();
    71                 printf("d ");
    72             }
    73         ++cnt;
    74         }
    75     }
    76     return 0;
    77 }

    //NOIP提高2008 T4

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/11348732.html
Copyright © 2011-2022 走看看