zoukankan      html  css  js  c++  java
  • P5462 X龙珠

    题目描述

    “X龙珠”是一款益智小游戏。游戏中有 n(2|n)n(2n) 个编号互不相同龙珠按照给定的顺序排成一个队列,每个龙珠上面都有一个编号。每次操作时,选择并取出龙珠队列中相邻的两个龙珠,放到目标队列的末尾(目标队列最开始是空的,且这两个龙珠的前后顺序不变),然后去除原龙珠队列的空隙。反复多次,直到原龙珠队列为空。可见,因为决策不一样导致目标队列顺序不一样。现在请求出所有方案中、目标队列字典序最大的方案。只需要给出目标队列即可。

    例如,当原龙珠队列是 [1,3,2,4] 时,可以先取出 3 和 2,此时目标队列是 [3,2],原龙珠队列是 [1,4];再将剩下两个龙珠放入目标队列,得到目标队列是 [3,2,1,4]

    输入格式

    第一行,一个整数 nn。

    接下来一行,每行 nn 个整数,表示原龙珠队列的编号。

    输出格式

    一行,nn 个整数。

    输入输出样例

    输入 #1
    4 
    3 1 4 2
    输出 #1
    4 2 3 1
    输入 #2
    6 
    6 5 4 1 3 2
    输出 #2
    6 5 4 1 3 2

    说明/提示

    对于 20% 的数据,nle10n10。
    对于 60% 的数据,nle10^3n103。
    对于 100% 的数据,nle10^5n105,龙珠编号不超过 n。

     
    先用链表存储每一个编号的数前一个和后一个数的编号,最后由大到小枚举一遍,将没有用过的点连上后一个一起输出(注意它能输出,当且仅当它后面有数)
     
    #include<cstdio>
    
    using namespace std;
    
    int n,a[100001],k[100001],x[100001],i;
    
    inline int read(){
        int s=0,w=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-'){
                w=-1;
            }
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            s=s*10+ch-'0';
            ch=getchar();
        }
        return s*w;
    }
    
    
    int main(){
        n=read();
        for(i=1;i<=n;++i){
            a[i]=read();
            k[a[i-1]]=a[i];
            x[a[i]]=a[i-1];
        }
        for(i=n;i>=1;--i){
            if(k[i]){
                printf("%d %d ",i,k[i]);
                k[x[i]]=k[k[i]];
                x[k[x[i]]]=x[i];
                k[k[i]]=0;
            }
        }
        return 0;
    }
  • 相关阅读:
    【翻译自mos文章】rman 标准版和企业版的兼容性
    HDU 1010 Tempter of the Bone
    uva 10716 Evil Straw Warts Live(贪心回文串)
    适配器及适配器模式
    Android推送技术研究
    【hadoop2.6.0】倒排索引遇到问题了
    【hadoop2.6.0】MapReduce原理
    【hadoop2.6.0】一句话形容mapreduce
    【leetcode】Median of Two Sorted Arrays(hard)★!!
    【leetcode】Merge k Sorted Lists
  • 原文地址:https://www.cnblogs.com/hrj1/p/11569957.html
Copyright © 2011-2022 走看看