代理服務器 —— 牛客網

題目描述

使用代理服務器可以在必定程度上隱藏客戶端信息,從而保護用戶在互聯網上的隱私。咱們知道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;
}
相關文章
相關標籤/搜索