---
# System prepended metadata

title: 實作題 - 流量 - APCS - by Peter Wang
tags: [APCS]

---


# 實作題 - 流量 - 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]