0%

[題解]APCS流量

110/01 實作題第二題 流量

這一題的題序有點複雜,看了幾次之後才看懂。但重點是在考試的時候沒有想到要怎麼合併流量,所以只用了一維陣列計算最小值,因此只有拿到50分…
這是完整版的程式碼,主要是透過創建一個陣列r[i][j],表示從城市i出發到城市j的總流量,再利用陣列r計算費用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0);
#define int long long
using namespace std;
int N,M,K,s[50][50],r[50][50];

signed main(){
ios;
cin>>N>>M>>K;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin>>s[i][j];
}
}
int ans = 1e8;

for(int k=0;k<K;k++){
memset(r, 0, sizeof(r));

for(int q=0;q<N;q++){
int p;//第i個伺服器架設在p城市
cin>>p;
for(int j=0;j<M;j++)r[p][j]+=s[q][j];
}
//如果第0個跟第1個伺服器都架設在1的位置,則將流量相加,得到陣列r
int sum = 0;
for(int q=0;q<M;q++){//0<p<M
for(int j=0;j<M;j++){
if(q==j)sum+=r[q][j];
else if(r[q][j]<=1000)sum+=3*r[q][j];
else sum+=(r[q][j]-1000)*2+3000;
}
}
ans = min(ans,sum);
}
cout<<ans<<endl;
}