前往
大廳
主題

ZeroJudge - c630: 基礎排序 #3 ( a ^ n 排大小 ) 解題心得

Not In My Back Yard | 2020-10-25 00:00:01 | 巴幣 0 | 人氣 145

題目連結:


題目大意:
輸入有多列(經測不超過 81000 列),每列給定兩正整數 a 、 n (1 < a 、 n < 10000000),代表一個正整數 a ^ n。

請將這些數字按照 a ^ n 的大小由大到小排序,如果 a ^ n 的值一樣則按照 a 的值由大到小排列。排序完後每列輸出一組 a 與 n 之值,參見範例輸出。



範例輸入:
5 10
6 9
7 8
8 7
9 6


範例輸出:
6 9
5 10
7 8
8 7
9 6


解題思維:
因為 a ^ n 的值可能很大,因此直接計算該值會比較耗時、比較大小時也較需要一點時間,況且又需要不少的空間來儲存其完整值。

而因為所有的 a ^ n 值都 > 1 ,因此我們可以放心地將所有數字都取其對數,變為 n × log(a) 之形式並仍保有原本的大小關係。因此我們可以使用這個值作為排序依據。而這個新的值比起原本的值小非常地多,小到可以使用雙精度浮點數(Double)儲存。

然後將每組 a 、 n 以及其 n × log(a) 之值全部以一結構(Struct)包在一起,然後為其撰寫一個符合題目要求的比較運算子(或函式),之後再排序、再輸出即可。

但是因為 n × log(a) 是浮點數,所以可能產生浮點數誤差。因此可以參照這題在判斷大小時的做法:
定義一准許誤差,在此定為 ERROR = 10 ^ (-10)。倘若有兩個浮點數 X 和 Y 要比大小,則先判斷兩者是否滿足 X - ERROR ≦ Y ≦ X + ERROR。如果是的話,則視為 X = Y;反之,直接使用比較運算子比較 X 、 Y 的大小即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作