#16069: c834大數比較


yotrew (熾翼)

學校 : 不指定學校
編號 : 5520
來源 : [163.32.95.190]
最後登入時間 :
2023-11-17 09:50:32
c834. 第五題:大數比較 -- 2018資訊學科能力競賽高中組高雄市 | From: [1.173.40.191] | 發表日期 : 2018-11-17 11:02

一開始我的解法是:
假設這次分數為M的陣列
上次分數為N的陣列
step01.找出M前面和N相同的序列
ex.
M:15561127
N:15564444
則此序列為1556,

step02.由此可知6之前的數都一樣大,所以第2步就找出M在6之後的值比6大的跟6交換
若找到3就step03,若找不到,就往前移,重複找動作.


step03.此時可倁
M是1557....
N是15564444
因此M一定大於N.因為要找最小,從7之後的數再按大小排列就可得到
此做法#0~#13只有#12發生TLE
主要是排好後要找大於第i個且是最小值,這個動作時間會是O(N^2),所以就產生TLE
---------
為了解決TLE,就想了另一種方法
step01.因為數字只有1~9 9個而已,因此就建立一個陣列(nums[])來記錄,這9個數字各出現幾次,再加上是1~9排列,
所以在數的過程就已經排好順序了(類似bucket sort?)

step02.如前一方法,先找出前面一樣的序列,
假設N:15564444
那我找第一個時,就是N[0]=1,nums[N[0]]>0就代表可以拿出來
M[0]就給它nums[N[0]],然後nums[N[0]]--
找第2個時N[1]=5,nums[N[1]]>0就代表可以拿出來
M[1]就給它nums[N[1]],然後nums[N[1]]--
如果nums[N[0]]等於0就代表找不到了,那前面就排好了

step03.從step02結果可知M陣列第i個之前都與N陣列之前都一樣,
那就找N[i]值加1,看能不能找到,找不到再找N[i]值加2,若找到就代表M的第i個比N的第i個大
如果都找不到就往回找,找i-1個(找之前把M[i-1]的值存回統計表中,nums[])
若有找到就進行step04.若找到第1個還找不到,就QQ

step04.
找到在第j個之前M和N都一樣,第j個M[j]>N[j],且它是最小值
剩下的就由統計表中,nums[]中按順序一個一個抓出來

此法的時間複雜度是
9*N*2(來回2次,從前面排到i 1次,再比i大的往回找1次) = O(9*N)  (9是數字的個數1~9)
---
yotrew

 
#16070: Re:c834大數比較


yotrew (熾翼)

學校 : 不指定學校
編號 : 5520
來源 : [163.32.95.190]
最後登入時間 :
2023-11-17 09:50:32
c834. 第五題:大數比較 -- 2018資訊學科能力競賽高中組高雄市 | From: [1.173.40.191] | 發表日期 : 2018-11-17 11:06



step03.從step02結果可知M陣列第i個之前都與N陣列之前都一樣,
那就找N[i]值加1,看能不能找到,找不到再找N[i]值加2,若找到就代表M的第i個比N的第i個大
--
N[i]值加1,N[i]值加2找到N[i]值加x小於等於9




 
ZeroJudge Forum