贪心策略:
量度标准:每次使用一个能够访问最多服务器(按顺序)即在服务器中最晚出现的代理服务器;


#include <iostream>
#include <vector>
using namespace std;
vector<string> agents;
vector<string> severs;
int minChange(vector<string> agents,vector<string> severs,int n,int m){
    vector<bool> flag(n,false);//用来标记代理是否出现在访问序列中
    int res=0;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(agents[j]==severs[i]){//访问的服务器是某个代理服务器
                if(n==1){//若只有一个,则无法完成访问。
                    return -1;
                }
                else{
                    flag[j]=true;//标记该代理
                    bool is_all=true;//作为是否所有代理被标记的标记
                    for(int k=0;k<n;k++){
                        if(flag[k]==false){//存在未被标记的代理
                            is_all=false;
                            break;
                            }
                        }
                    if(is_all==true){//如果全部呗标记就说明刚被标记的是最晚被标记的,此时需要切换下一个最晚被标记的
                        res++;
                        for(int k=0;k<n;k++){
                            flag[k]=false;
                        }
                        flag[j]=true;//若全部被标记,从头开始时,agent[j]仍要保持被标记的状态
                    }
                }
                break;
            }
        }
    }
    return res;
}
int main(){
    int n=0,m=0;
    int res=0;
    string data;//获取输入数据
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>data;
        agents.push_back(data);
    }
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>data;
        severs.push_back(data);
    }
    res=minChange(agents,severs,n,m);
    cout<<res<<endl;
    
}