#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。



京公网安备 11010502036488号