前往
大廳
主題

ZeroJudge - f461: 現金兌換點卷 解題心得

Not In My Back Yard | 2020-12-08 00:00:01 | 巴幣 2 | 人氣 258

題目連結:


題目大意:
輸入有多筆測試資料,每筆佔兩列。測資第一列給定一正整數 N (N ≦ 100000),代表有 N 張卡片。接著第二列給定 N 個整數 a (a < 100000),代表這 N 張卡片上各自所寫著的數字。

求所有可能的卡片對,其數字差之絕對值的總和為多少?



範例輸入:
4
50 10 30 20
2
100 150


範例輸出:
130
50


解題思維:
直接窮舉每一對求差值然後加總,其時間複雜度 O(N ^ 2),肯定是會超時的。



我們先將給定的卡片之數字由小到大排序,並重新命名為 A1 、 A2 、 …… 、 AN

可以看到所求的總和為
(A2 - A1) + (A3 - A1) + …… + (A3 - A2) + …… + (AN - AN-1)

觀察的數量每一項可以得到一個規律,即數字 Ai (1 ≦ i ≦ N)會為總和貢獻
(i - 1) × Ai - (N - i) × Ai
之值,合併項次可得
(2i - N - 1) × Ai

因此我們排完序後,掃過每個數字求上式的值然後全部加總即是所求。其時間複雜度為 O(N log(N))。




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

創作回應

心彩
您提供的答案會TLEㄟ
2022-11-11 09:18:12
Not In My Back Yard
因為 Zerojudge 在這些歲月之中似乎又變慢了一點點,當然這是原因之一。

另一個因素是這篇心得提到的觀察不是最佳的策略,實際上可以降到 O(n) (參見本題於 Zerojudge 的討論區)。

而其中最大的原因是本題的瓶頸(Bottleneck)實際上是最後一筆的輸入資料非常地大。可以看到用
https://home.gamer.com.tw/artwork.php?sn=5136724
這題的最佳化後時間會直接變快一倍以上。
2022-11-11 18:48:02
Not In My Back Yard
以上,希望有幫到你。
2022-11-11 18:48:24
心彩
原本的方法改IO 就可以了嗎?
2022-11-11 22:53:18
Not In My Back Yard
是的。
2022-11-12 01:00:29

更多創作