Just Sort 演算法題

2021-10-23 15:04:08 字數 1687 閱讀 6493

1. 題目要求

★實驗任務

定兩個序列 a b,序列 a 原先是乙個單調遞增的正數序列,但是由於某些 原因,使得序列亂序了,並且一些數丟失了(用 0 表示)。經過資料恢復後,找 到了正數序列 b ,且序列 a 中 0 的個數等於序列 b 的個數,打算使用序列 b 恢 復序列 a 。

對於序列 a 來說,我們可以交換兩個位置上的非零的數,並且可以交換任意 次。序列 b 同樣也可以進行任意次交換。

現在要將序列 b 填充到序列 a 中的值丟失的位置上,序列 b 中的每個數只能 填充一次,問最後構成的序列是否是單調遞增的,如果是,則輸出填充後的序列, 否則輸出-1。

★資料輸入

輸入給定 n m,表示序列 a 和序列 b 的長度。

第一行為序列 a ,第二行為 序列 b。 題目保證除了 0 以外的數,在序列 a 和 b 中只出現一次。

資料保證:

80%的資料,n, m <= 100

100%的資料,n, m <= 100000, 0 <= a[i] <= 100000, 0 < b[i] <= 100000

★資料輸出

如果最後序列 a 是單調遞增的,輸出該序列,否則輸出-1。

★輸入示例1

4 20 11 0 15

1 12

★輸出示例 1

1 11 12 15

★輸入示例2

4 20 0 11 15

1 12

★輸出示例 2

-12. 簡要分析

這道題目的話,最簡單的做法是直接對輸入的a陣列中的0的位置儲存,然後b陣列中先排序一次,計入位置之後進行比對就行了。相應的解法見heihuifei

由於題中資料0 <= a[i] <= 100000, 0 < b[i] <= 100000,所以我們可以用一種類似桶排的思路來解決。桶s初始化為0,a[i]輸入就更新一下記錄,同時要記錄一下0的下標的位置。b[i]的輸入時桶s也要更新(這樣儲存著兩段序列拼起來的結果),同時也要更新一下桶isb的狀態(存著序列b的值)。最後遍歷一下桶s,判斷一下為零的位置是不是b[i]的值,如果不是的話就輸出-1,遍歷完是的話,沒問題。

3. **實現

#include

#include

#include

using

namespace std;

const

int max=

1e5+5;

bool iszero[max]=;

bool s[max]=;

//初始化桶

bool isb[max]=;

const

int inf =

0x3f3f3f3f

;int n,m;

intmain()

else}}

for(

int i=

0;i++i)

for(

int i=

0,j=

0;i++i)

++j;}}

for(

int i =

0;i++i)

}return0;

}// 4 2

// 0 11 0 15

// 1 12

ps:該**由某位大佬所想到的,我不過是在理解的基礎上分享下。

演算法 常見演算法題

演算法題 假如有100個不相同的數,比如從1到100,怎樣使用10次取出其中的10個不同的數字,要求每個數取出的概率一樣 一開始沒有說10次,所以我說,使用乙個random函式,以時間為種子來取,當取出乙個時,做標記,下次再取到這個數時,重新取一次 然後他就說了如果只能夠取10次怎麼辦?一開始我想到...

基礎演算法題

1.一百萬富翁遇到一陌生人,陌生人找他談乙個換錢的計畫,計畫如下 我每天給你十萬,而你每天只需要給我一分錢,第二天我仍然給你十萬元,你給我二分錢,第三天我仍然給你十萬,你給我四分錢.你每天給我的錢是前天的兩倍,直到乙個月 30天 百萬富翁很高興,欣然接受拉這個契約.請編寫乙個程式計算這乙個月中陌生人...

演算法題筆記

1 請給出乙個o nlogn 的演算法,使之能夠找出乙個n個數的序列中最長的單調遞增子串行。這是演算法導論中的一道課後題。解法一 利用求最長公共子串行的思想,將n個數的序列a先排序形成乙個有序的序列b,然後利用動態規劃的思想求a與b的最長公共子串行,得到的最長公共子串行就是所求的解。但是我們知道最長...