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的最長公共子串行,得到的最長公共子串行就是所求的解。但是我們知道最長...