# 實作題 - 流量 - APCS - by Peter Wang ## 題目資訊 此題為2021.1測驗中的題目2 ###### tags: `APCS` ## 題目敘述 有 n 個伺服器編號 0 到 n−1,以及 m 個城市編號 0 到 m−1,已知第 i 個伺服器要傳送到城市 j 的流量為 Q[i][j]。 工程師們在規劃每個伺服器應該要放在哪個城市,對於一個方案 c=(c1,c2,c3,…cn),表示編號 i 的伺服器要放在城市 ci。 城市之間資料傳輸是需要費用的,若城市u 要傳送 f 的流量到城市 v,費用的計算方式如下: 若 u=v,每單位流量需要花 1 塊錢。 若 u≠v,小於等於 1000 的流量每單位要 3 塊錢,大於 1000 的部份每單位 2 塊錢。 若城市u 有多個伺服器都要傳送流量到城市 v,會先將這些起點終點相同的傳輸流量相加再計算花費。 工程師們總共提出了 k 種方案,請你找到花費最少的方案所需的費用。 ### 輸入: 第一行包含三個整數 n,m,k。 接下來 n 行每行有 m 個整數,第 i 行的第 j 個數字為 Q[i][j]。 接下來有 k 行,每行有 n 個整數,表示一個方案。 ### 輸出: 輸出費用最小的方案所需的花費。 ## 解題思路 按照題目規則實作,雖然稍微有點複雜,不過最終都能解出來。 ## 程式碼 ```clike= #include <climits> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int NMAX = 50; const int MMAX = 50; int S[NMAX][MMAX]; int A[MMAX][MMAX]; int main() { int N, M, K; cin >> N >> M >> K; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> S[i][j]; } } int ans = INT_MAX; for (int k = 0; k < K; k++) { memset(A, 0, sizeof(A)); for (int i = 0; i < N; i++) { int p; cin >> p; for (int j = 0; j < M; j++) A[p][j] += S[i][j]; } int sum = 0; for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { if (i == j) { sum += A[i][j]; } else if (A[i][j] <= 1000) { sum += A[i][j] * 3; } else { sum += A[i][j] * 2 + 1000; } } } ans = min(ans, sum); } cout << ans << endl; return 0; } ``` ## 資料來源 [zerojudge](https://zerojudge.tw/) [題目敘述](https://zerojudge.tw/ShowProblem?problemid=f606) ## 備註 >[name=PeterWang] >[time=Thu, Aug 12, 2021 10:24 PM]