贪心策略:
量度标准:每次使用一个能够访问最多服务器(按顺序)即在服务器中最晚出现的代理服务器;
#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;
}
