#include <iostream>
using namespace std;

int main()
{
    int m;//代理服务器个数
    int n;//服务器个数
    while(cin>>m)
    {
        string d[m];
        int lu[m];
        for(int i=0; i<m; i++)
            cin>>d[i];
        cin>>n;
        string f[n];
        for(int i=0; i<n; i++)
            cin>>f[i];
        int fang=0;//标识现在访问到哪个服务器
        bool guo[m];
        int Count=-1;
        while(fang!=n)
        {
            //每次初始化
            for(int j=0; j<m; j++)
            {
                guo[j]=false;
                lu[j]=0;
            }
            //确定每个代理服务器能走多长的路
            for(int i=fang; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    if(!guo[j]&&d[j]!=f[i])
                        lu[j]++;
                    else if(!guo[j]&&d[j]==f[i])
                        guo[j]=true;
                }
            }
            //选择
            int Max=0;
            for(int i=0; i<m; i++)
            {
                if(Max<lu[i])
                    Max=lu[i];
            }
            if(Max==0)
            {
                Count=-1;
                break;
            }
            fang=Max+fang;
            Count++;
        }
        cout<<Count<<endl;
    }
    return 0;
}

思路:每次选择能访问服务器个数最多的代理服务器,此为贪心。

对于没有符合要求的安排方式的理解:即没有选择,何为没有选择?就是没有与下一个服务器不相等的代理服务器,什么时候会出现?只有一个代理的时候,遇到与其IP相等的服务器,则别无选择。在代码上体现为能访问服务器个数最多为0,此时即可退出循环,输出-1。