#40047: 作者提供的解法


xavier13540 (柊 四千)

學校 : 國立臺灣大學
編號 : 21783
來源 : [111.249.92.6]
最後登入時間 :
2024-05-05 07:36:09
a491. 貨物集中問題 -- 100學年度彰雲嘉區資訊學科能力競賽 | From: [1.171.44.145] | 發表日期 : 2024-04-24 23:57

<p>這題相當於:給定一個 $\color{black}{n\times m}$ 的矩陣 $\color{black}{\{a_{i, j}\}}$,其中 $\color{black}{a_{i, j}\ge0}$,請找出某個 $\color{black}{i^*}$ 與 $\color{black}{j^*}$ 以最小化</p>
<p>\[\color{black}{S(i^*, j^*) := \sum_{i=1}^n\sum_{j=1}^m(|i^*-i|+|j^*-j|)a_{i, j}.}\]</p>
<p>注意我們有</p>
<p>\[\color{black}{ \begin{split} S(i^*, j^*) &amp;= \sum_{i=1}^n\sum_{j=1}^m|i^*-i|a_{i, j} + \sum_{i=1}^n\sum_{j=1}^m|j^*-j|a_{i, j}\\ &amp;= \sum_{i=1}^n\left(|i^*-i|\sum_{j=1}^ma_{i, j}\right) + \sum_{j=1}^m\left(|j^*-j|\sum_{i=1}^na_{i, j}\right) \end{split} }\]</p>
<p>令第 $\color{black}{i}$ 列的和 $\sum_{j=1}^ma_{i, j}$ 為 $\color{black}{S^r_i}$,第 $\color{black}{j}$ 行的和 $\color{black}{\sum_{i=1}^na_{i, j}}$ 為 $\color{black}{S^c_j}$,則上式可進一步化簡成</p>
<p>\[ \color{black}{ S(i^*, j^*) = \sum_{i=1}^nS^r_i|i^*-i| + \sum_{j=1}^mS^c_j|j^*-j|. } \]</p>
<p>如果我們可以解決問題 A:</p>
<table style="border-collapse: collapse; width: 100.058%;" border="1"><colgroup><col style="width: 99.8849%;"></colgroup>
<tbody>
<tr>
<td>
<p><strong>問題 A</strong>:給定一非負實數數列 $\color{black}{c_1, c_2, \ldots, c_n}$,請找出某個正整數 $\color{black}{i^*}$ 以最小化 $S(i) := \color{black}{\sum_{i=1}^nc_i|i^*-i|}$。</p>
</td>
</tr>
</tbody>
</table>
<p>就能解決原本的問題。注意問題 A 有個顯然的 $\color{black}{\Theta(n^2)}$ 時間的演算法,而由於本題已存在輸入的 $\color{black}{\Theta(nm)}$ 門檻,採用此演算法已可通過本題。</p>
<p>以下介紹如何在 $\color{black}{O(n)}$ 時間內算出問題 A 的答案。設 $\color{black}{k \in \{1, 2, \ldots, n-1\}}$,注意我們有</p>
<p>\[\color{black}{\begin{split} S(k+1)-S(k) &amp;= \sum_{i=1}^n c_i|k+1-i| - \sum_{i=1}^nc_i|k-i|\\ &amp;= \sum_{i=1}^nc_i(|k+1-i|-|k-i|)\\ &amp;= \sum_{i=1}^kc_i((k+1-i)-(k-i)) + \sum_{i=k+1}^nc_i((i-k-1)-(i-k))\\ &amp;= \sum_{i=1}^kc_i - \sum_{i=k+1}^nc_i. \end{split}}\]</p>
<p>由 $\color{black}{\sum_{i=1}^kc_i}$ 隨著 $\color{black}{k}$ 遞增,$\color{black}{\sum_{i=k+1}^nc_i}$ 隨著 $\color{black}{k}$ 遞減,我們知道 $\color{black}{S(k+1)-S(k)}$ 隨著 $\color{black}{k}$ 遞增,因此 $\color{black}{i^*}$ 為滿足 $\color{black}{\sum_{i=1}^kc_i\ge\sum_{i=k+1}^nc_i}$(即 $\color{black}{2\sum_{i=1}^kc_i}\ge\sum_{i=1}^nc_i$)的最小整數 $\color{black}{k}$,可在 $\color{black}{O(n)}$ 時間內求出。</p>

 
ZeroJudge Forum