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