使用代理服務器可以在必定程度上隱藏客戶端信息,從而保護用戶在互聯網上的隱私。咱們知道n個代理服務器的IP地址,如今要用它們去訪問m個服務器。這 m 個服務器的 IP 地址和訪問順序也已經給出。系統在同一時刻只能使用一個代理服務器,並要求不能用代理服務器去訪問和它 IP地址相同的服務器(否則客戶端信息頗有可能就會被泄露)。在這樣的條件下,找到一種使用代理服務器的方案,使得代理服務器切換的次數儘量得少。算法
每一個測試數據包括 n + m + 2 行。
第 1 行只包含一個整數 n,表示代理服務器的個數。
第 2行至第n + 1行每行是一個字符串,表示代理服務器的 IP地址。這n個 IP地址兩兩不相同。
第 n + 2 行只包含一個整數 m,表示要訪問的服務器的個數。
第 n + 3 行至第 n + m + 2 行每行是一個字符串,表示要訪問的服務器的 IP 地址,按照訪問的順序給出。
每一個字符串都是合法的IP地址,形式爲「xxx.yyy.zzz.www」,其中任何一部分均是0–255之間的整數。輸入數據的任何一行都不包含空格字符。
其中,1<=n<=1000,1<=m<=5000。服務器
可能有多組測試數據,對於每組輸入數據, 輸出數據只有一行,包含一個整數s,表示按照要求訪問服務器的過程當中切換代理服務器的最少次數。第一次使用的代理服務器不計入切換次數中。若沒有符合要求的安排方式,則輸出-1。測試
輸入spa
3
166.111.4.100
162.105.131.113
202.112.128.69
6
72.14.235.104
166.111.4.100
207.46.19.190
202.112.128.69
162.105.131.113
118.214.226.52代理
輸出code
1server
貪心算法,每次都選擇能訪問最多server的proxy。ci
#include<bits/stdc++.h> using namespace std; int main() { int n,m; while(cin >> n) { string proxy[n]; for(int i = 0;i < n;i++) cin >> proxy[i]; cin >> m; string server[m]; for(int i = 0;i < m;i++) cin >> server[i]; int visited = 0;//已訪問到第幾個server int change = 0;//切換次數 int max;//某個proxy能訪問的server數量最大值 while(visited < m) { max = 0; for(int i = 0;i < n;i++) { int cnt = 0; for(int j = visited;j < m;j++)//從還沒被訪問的server開始 { if(proxy[i] != server[j]) cnt++; else break; } if(cnt > max) max = cnt; } if(max == 0) break;//沒有合適的調度方案 visited += max; change++; } if(max == 0) cout << -1 << endl; else cout << change-1 << endl;//最後一個server訪問完不用切換 } return 0; }