排序

3.1 题意描述

众所周知,熟练掌握至少一种排序算法是参加NOIP的必备技能。常见的排序算法有冒泡 排序、归并排序、快速排序、奇偶排序、猴子排序、梳排序、鸡尾酒排序、臭皮匠排序等。 在这里,介绍一种利用栈进行排序的方法。例如,当数组中的元素为 1,3,2 时,我们可 以利用栈对其进行排序:1 入栈;3 入栈;3 出栈;2 入栈;2 出栈;1 出栈。在这个例子中, 出栈序列是 3,2,1,因而实现了对数组的排序。 遗憾的是,在不打乱入栈顺序的前提下,有时仅仅借助一个栈是不能实现对数组的完全排 序。例如给定数组 2,1,3,借助一个栈,能获得的字典序最大的出栈序列是 3,1,2。(2 入 栈;1 入栈;3 入栈;3 出栈;1 出栈;2 出栈) 现请你借助一个栈,在不打乱入栈顺序的情况下,对数组进行从大到小排序。当无法完全 排序时,请输出字典序最大的出栈序列。

3.2 输入格式

输入共 2 行。 第一行包含一个正整数 n,表示入栈序列长度。 第二行包含 n 个整数,表示入栈序列。输入数据保证给定的序列是 1 到 n 的全排列,即 不会出现重复数字。
3.3 输出格式
输出仅一行,共 n 个整数,表示字典序最大的出栈序列。

3.4 样例输入

5 2 1 5 3 4

3.5 样例输出

5 4 3 1 2

3.6样例解释

2 入栈;1 入栈;5 入栈;5 出栈;3 入栈;4 入栈;4 出栈;3 出栈;1 出栈;2 出栈

3.7 数据规模与约定

• 对于 40% 的数据:N ≤ 10;

• 另有 20% 的数据:N ≤ 103;

• 另有 20% 的数据:N ≤ 105;

• 对于 100% 的数据:N ≤ 106。

————————————————分割线————————————————

分析:

1.1 题意简述
给定一个栈和一个 n 的全排列作为入栈序列,试通过调整出栈次序,得到字典序最大的 出栈序列。

1.2 解法一
暴力枚举每次是入栈还是出栈,即穷举所有可能的出栈序列,从而得到字典序最大的出栈 序列。 时间复杂度:O(C(n)),其中 C(n) 为卡特兰数列的第 n 项,期望得分 40 分。

1.3 解法二
使用各种神奇的贪心算法,求解字典序最大的出栈序列。由算法复杂度及正确性决定最后 得分。 期望得分 0−100 分。

1.4 解法三

依旧考虑贪心算法。要求字典序最大,故我们可以从 n 到 1 贪心地试探每个数能否加入 出栈序列。假设我们已经枚举到了 i,若栈顶元素比 i 大,我们则可以弹出栈顶元素,将其加 入出栈序列,直到栈顶元素≤ i。 若 i 未在栈中,我们则将入栈序列中在 i 前面且未入栈的数入栈,并将 i 加入出栈序列; 若 i 在栈中且是栈顶元素,我们则将 i 弹出栈,并加入出栈序列; 若 i 已经在栈中且不是栈顶元素,则说明若将 i 加入出栈序列,之前必然要把比 i 小的数 弹出栈,我们不这样做,继续枚举 i−1。 注意由于涉及大规模文件处理,此题需要使用输入输出优化。 时间复杂度为 O(n),期望得分 100 分。

本蒟蒻考试时写了解法二 , 得了55分。现在看来,出数据的人特别善良,我的完全乱搞的蜜汁算法居然给了55分!!

算了还是贴上错误代码。

#include "cstdio"
#include "cstring"
#include "algorithm"
#include "iostream"
#define Never return
#define Explode 0 using namespace std ;
const int maxN = 10e6 + ;
const int INF = ; int stack[ maxN ] , arr[ maxN ] ; int top ; inline int gmax ( int x , int y ) {return x > y ? x : y ; } int INPUT ( ) {
int x = , f = ;char ch = getchar( ) ;
while ( ch < '' || ch > '' ) { if( ch == '-' ) f= - ; ch = getchar( ) ; }
while ( ch >= '' && ch <= '' ) { x = ( x << ) + ( x << ) + ch - '' ; ch = getchar( ) ; }
return x * f ;
} int main ( ) {
freopen ( "sort.in" , "r" , stdin ) ;
freopen ( "sort.out" , "w" , stdout ) ;
int N = INPUT ( ) ;
int M = N ;
for ( int i= ; i<=N ; ++i ) {
stack[ ++ top ] = INPUT ( ) ;
while ( stack [ top ] == M && top ) {
printf ( "%d " , stack[ top-- ] ) ;
--M ;
}
}
while ( top ) printf ( "%d " , stack[ top-- ] ) ;
fclose ( stdin ) ;
fclose ( stdout ) ;
Never Explode ;
}

WA

贴上AC代码:

 #include "bits/stdc++.h"
#define Never return
#define Explode 0 using namespace std ;
const int maxN = 10e6 + ; int stk[ maxN ] ;
int vis[ maxN ] ; int top ; int INPUT ( ) {
int x = , f = ;char ch = getchar( ) ;
while ( ch < '' || ch > '' ) { if( ch == '-' ) f= - ; ch = getchar( ) ; }
while ( ch >= '' && ch <= '' ) { x = ( x << ) + ( x << ) + ch - '' ; ch = getchar( ) ; }
return x * f ;
} int main ( ) {
int N = INPUT ( ) ;
int M = N ;
freopen ( "hahaha.out" , "w" , stdout ) ;
for ( int i= ; i<=N ; ++i ) {
int tmp = INPUT( ) ;
while ( vis[ M ] ) -- M ; //还未入栈的期望的最大值
while ( M < stk[ top ] ) {
printf ( "%d " , stk[ top -- ] ) ;
} if ( tmp == M ) printf ( "%d " , tmp ) , vis[ tmp ] = true ;
else {
stk[ ++top ] = tmp ;
vis[ tmp ] = true ;
}
}
while ( top > )printf ( "%d " , stk[ top -- ] ) ;
Never Explode ;
}

AC++

NOIP_RP++;

2016-10-07 23:29:49

(完)

20161007 NOIP 模拟赛 T1 解题报告的更多相关文章

  1. 20161022 NOIP模拟赛 T1 解题报告

    旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...

  2. 20161023 NOIP 模拟赛 T1 解题报告

    Task 1.纸盒子 (box.pas/box.c/box.cpp) [题目描述] Mcx是一个有轻度洁癖的小朋友.有一天,当他沉溺于数学卷子难以自拔的时候,恍惚间想起在自己当初学习概率的时候准备的一 ...

  3. 20161004 NOIP 模拟赛 T1 解题报告

    第1题  小麦亩产一千八 [问题描述] “有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,话说HYSBZ(Hengyang School for Boys & Zy) ...

  4. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  5. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  6. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  7. NOIP欢乐模拟赛 T1 解题报告

    小澳的方阵 (matrix.cpp/c/pas) [题目描述] 小澳最近迷上了考古,他发现秦始皇的兵马俑布局十分有特点,热爱钻研的小澳打算在电脑上还原这个伟大的布局. 他努力钻研,发现秦始皇布置兵马俑 ...

  8. CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

    T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7 ...

  9. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

随机推荐

  1. ASP.NET的Cookie和Session

    HTTP属于应用层,HTTP协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4.无连接;5.无状态. 无状态HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就 ...

  2. HTML5应用之文件拖拽上传

    使用HTML5的文件API,可以将操作系统中的文件拖放到浏览器的指定区域,实现文件上传到服务器.本文将结合实例讲解HTML5+jQuery+PHP实现拖拽上传图片的过程,来看下HTML5的魅力吧. H ...

  3. Sql Server 索引之唯一索引和筛选索引

    唯一索引(UNIQUE  INDEX) 当主键创建时如果不设置为聚集索引,那么就一定是唯一的非聚集索引.实际上,唯一索引,故名思议就是它要求该列上的值是唯一的.唯一索引能够保证索引键中不包含重复的值, ...

  4. SOLR+LUCENE错误

    java.lang.NoClassDefFoundError: org/apache/lucene/analysis/synonym/SynonymFilter 该错误发生在自定义SOLR服务器时,原 ...

  5. PHP_Memcache函数详解

    memcache函数所有的方法列表如下: Memcache::add – 添加一个值,如果已经存在,则返回false Memcache::addServer – 添加一个可供使用的服务器地址 Memc ...

  6. WPF QuickStart系列

    接触WPF有一段时间了,现在做的项目也是WPF相关的.所以决定写一个WPF QuickStart系列的文章.也是自己对WPF学习的总结,如果对你有帮助,就非常棒了.因为不善言辞,所以尽量以WPF示例和 ...

  7. 注解:【有连接表的】Hibernate单向1->N关联

    Person与Address关联:单向1->N,[有连接表的] Person.java package org.crazyit.app.domain; import java.util.Hash ...

  8. Android LayoutInflater详解 (转)

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  9. Android源码学习之模板方法模式应用

    一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...

  10. SpringJDBC解析2-execute方法

    大家都使用过JDBCTEMPLATE的execute方法,execute作为数据库操作的核心入口,将大多数数据库操作相同的步骤统一封装,而将个性化的操作使用参数PreparedStatementCal ...