APCS 110/01 實作題第二題題解 流量
2021-01-09 17:00:42 by
題目敘述
有 \(N\) 個 server,\(M\) 個城市,每個 server 要向各城市傳輸資料。同城市內單位資料傳輸價格為 $1,不同城市間單位資料傳輸價格為 $3,但若傳輸量超過 1000 則超過的部分可享優惠價 $2。(所有城市間的單向 pair 分開計算)
今有 \(K\) 個把 server 放在各城市的方案,問當中最划算的方案之價格。
輸入格式
\[
\begin{matrix}
N & M & K \\
s_{0,0} & s_{0,1} & ... & s_{0,M-1} \\
s_{1,0} & s_{1,1} & ... & s_{1,M-1} \\
... \\
s_{N-1,0} & s_{N-1,1} & ... & s_{N-1,M-1} \\
p_{0,0} & p_{0,1} & ... & p_{0,N-1} \\
p_{1,0} & p_{1,1} & ... & p_{1,N-1} \\
... \\
p_{K-1,0} & p_{K-1,1} & ... & p_{K-1,N-1} \\
\end{matrix}
\]
\(N, M, K \le 50\)
\(s_{i,j}\) 為 server #i 要向 城市 #j 傳送多少資料
\(p_{i,j}\) 為第 i 個方案打算把 server #j 放到第幾個城市 (\(0 \le p_{i,j} < M\))
保證答案不超過 \(10^8\)
輸出格式
印出一個數字:最佳方案的花費
題解
直接算
C++ 參考解答
#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;
}
[題解] [APCS] [APCS 110/01]