切換
舊版
前往
大廳
主題

ZeroJudge - c134: 00668 - Parliament 解題心得

Not In My Back Yard | 2019-10-07 23:12:37 | 巴幣 2 | 人氣 392

題目連結:


題目大意:
第一列給定一正整數,代表有多少組測試資料。第一列與各組測資之間皆有空白列。每組測資只有一列,其給定一正整數 N ( 5 ≦ N ≦ 1000),代表有 N 位議員。

每個議員只會待在一個委員會,每個委員會的人數皆不相同。每天每個委員會會推派出一個議員參加會議,而會議議員之組成每天需要有所差異。會議將運行至每天的議員組成不得不重複為止。

求要將議會的運行天數最大化,委員會之人數分配應為何?



範例輸入:
3

31

5

8


範例輸出:
2 3 5 6 7 8

2 3

3 5


解題思維:
本題就是要求將 N 分解成:
N = a1 + a2 + a3 +…… ,其中 0 < a1 < a2 < a3 < ……  。並最大化 a1 × a2 × a3 × …… 之值。

當然,可以發現不是分越多部分,乘積就會越大。像是: N = 10 = 2 + 3 + 5 = 1 + 2 + 3 + 4。前者的乘積為 30 ;後者為 24 。

但是也可以看到當新部分不是 1 時,就應該分出來。例如: N = 9 = 2 + 3 + 4 = 4 + 5 。前者乘積 24 ;後者是 20 。

因此當 N = 5 、 9 、 14  、 …… 時可拆解為 2 + 3 、 2 + 3 + 4 、 2 + 3 + 4 + 5 、 ……該分解即是他們的最佳解。

接著可以看到:6 = 2 + 4 、 7 = 3 + 4 、8 = 3 + 5;10 = 2 + 3 + 5 、 11 = 2 + 4 + 5 ……當 N 逐漸+1 時,那個新得到的「1」將會分配到從最左邊的數字開始看起第一個不是連續的數字之前(例如 2 、 3 、 5 ,將分配到 3 使其 + 1)。其策略會將乘積最大化。(雖然直觀,但是可以動手寫寫看證明)

因此,預先將所有可能的 N 值按照上面的策略求出最佳解。輸入時,碰到什麼 N 值就輸出相應的分配法。

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

創作回應

相關創作

更多創作