20161007 NOIP 模擬賽 T1 解題報告

2022-06-02 16:21:06 字數 3273 閱讀 1507

排序

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 + 100

;const

int inf = 2147483647

;int

stack[ maxn ] , arr[ maxn ] ;

inttop ;

inline

int gmax ( int x , int y )

intinput ( )

while ( ch >= '

0' && ch <= '

9' )

return x *f ;

}int

main ( )

}while ( top ) printf ( "

%d " , stack[ top--] ) ;

fclose ( stdin ) ;

fclose ( stdout ) ;

never explode ;

}

wa貼上ac**:

1 #include "

bits/stdc++.h"2

#define never return

3#define explode 045

using

namespace

std ;

6const

int maxn = 10e6 + 100;7

8int

stk[ maxn ] ;

9int

vis[ maxn ] ;

1011

inttop ;

1213

intinput ( )

16while ( ch >= '

0' && ch <= '

9' )

17return x *f ;18}

1920

intmain ( )

3031

if ( tmp == m ) printf ( "

%d " , tmp ) , vis[ tmp ] = true;32

else

36}

37while ( top > 0 )printf ( "

%d " , stk[ top --] ) ;

38never explode ;

39 }

ac++

noip_rp++;

2016-10-07 23:29:49

(完)

noip模擬賽 密碼

表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...

NOIP模擬賽 老師

題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...

NOIP模擬賽 分錢

題目描述 兩個人在街上撿到了一些錢,這些錢共有n張,他們等了很久也沒有等來失主,於是決定把錢平分。但錢可能無法平分。他們先把能夠平分的錢盡量先平分了,使得剩下不能平分的錢盡量少。這些不能平分的錢怎麼辦呢他?他們決定拿去賭場裡面賭一把。他們運氣太好了,那些不能平分的錢變成了雙倍,於是他們就把那個錢分了...