• 七月月赛T2


    题目描述

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

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

    输入输出格式

    输入格式:

     

    第一行,一个整数 n

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

     

    输出格式:

     

    一行,n 个整数。

     

    输入输出样例

    输入样例#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% 的数据,n10。
    对于 60% 的数据,n103
    对于 100% 的数据,n105,龙珠编号不超过 n。

    思路:

    龙珠这个东西是个好东西,听同学说挺好看的。。。

    这题机房的大佬一拍大腿,顺口说出了树形结构这个高大上的东西,蒟蒻表示不会啊(其实是懒得打。。。),在仔细看看题目,这题不就是链表吗,但是指针好像不会啊。。。

    那就用数组模拟一下吧。。。

    用链表存下每一个点的前一个和后一个,然后从大往小找,仅当他后面有数时,将没用过的点连同他后面的一个一起输出,输出后把他前面的数和他后面的后面的数连上然后就没了

    代码

     1 #include<iostream>
     2 using namespace std;
     3 const int maxn=1e6+10;
     4 int sum[maxn],head[maxn],next[maxn];
     5 int main()
     6 {
     7     int n,m;
     8     cin>>n;
     9     for(int i=1;i<=n;i++)
    10     {
    11         cin>>sum[i];
    12         next[sum[i-1]]=sum[i];
    13         head[sum[i]]=sum[i-1];
    14     }
    15     for(int i=n;i>=1;i--)
    16     {
    17         if(next[i])
    18         {
    19             cout<<i<<" "<<next[i]<<" ";
    20             next[head[i]]=next[next[i]];
    21             head[next[head[i]]]=head[i];
    22             next[next[i]]=0;    
    23         }
    24     }
    25     cout<<endl;
    26     return 0;
    27 }
  • 相关阅读:
    Android事件机制之一:事件传递和消费
    数据类型和JSON格式
    json 数据交换格式与java
    写给iOS程序员的命令行使用秘籍
    pthread_create线程创建的过程剖析
    同步变量及知识要素
    mysql 批量更新与批量更新多条记录的不同值实现方法
    gettype
    寻求全站搜索功能开发思路
    DEDE中 field:rel 是什么意思,起一个什么样的作用效果
  • 原文地址:https://www.cnblogs.com/2529102757ab/p/11205606.html
Copyright © 2020-2023  润新知