这道题,说真的恶心到我了,并没有运用任何算法,没有运用任何函数,结构啥的,只是单纯的一个类似于贪心的步长问题,我做了一下午,历次做错主题思路和正确答案基本一致,只不过我的错误思路太过于混乱,脑袋疼,不过,不得不说正确答案确实巧妙。
错误思路:
这里一定要说一下我的错误思路,真的是太伤脑筋了,因为这个我想的是在整个M台服务器中先找出每个N台服务器的位置,然后设置一个标志数组,标志当前N台服务器是否被访问过,设置标志数组的原因是为了标志台数变量SIZE,这个size是为了标记当前已经找到的N台服务器,只要size!=N,这个就可以一直访问下去,只要size == N了,就代表已经找到所有可用的服务器了,就开始新的一轮寻找,结果轮次加一,但是问题就来了,这个对于N==1 的情况要单独讨论,因为只要size=0加一就成了N,这时如果开始新的一轮,就会导致连串的错误,不想想了,越想越乱。
正确思路:
首先上正确通过的代码:
#include<stdio.h>
#include<string.h>
char source[3000][20];
char target[3000][20];
int n,m;
int main(){
while(scanf("%d",&n)!=EOF){
int res=0;//定义结果,每轮都是0开始
for(int i=1;i<=n;i++){
scanf("%s",source[i]);
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%s",target[i]);
}
int now=1;//定义当前位置
bool isOk=true;//这一轮次是否可用,当上一步走的步长为0的时候,说明每个服务器都走不了,
//就失败了,即isOk=false;
while(isOk&&now<=m){
int maxNum=0,j;//定义本轮次,可以走的最大步长
for(int i=1;i<=n;i++){//依次考察每个n台服务器
for(j=now;j<=m;j++){//对于每台服务器,寻找它所能走的最大步长
if(strcmp(source[i],target[j])==0){
if(maxNum<j-now)maxNum=j-now;//找到最大步长后,赋值给总的目前的最大步长
break;//每个服务器走完后,均跳出循环,即只找一次,最近的一个
}
}
if(j==m+1)maxNum=j-now;//如果没找到,说明这个服务器就可以一直走到最后
}
if(maxNum==0){
isOk=false;//如果本轮次,每个服务器都走不了,说明失败
}else{
now+=maxNum;
res++;//如果成功,则进入下一轮次,下一轮次开始为当前位置加上最大步长,类似于贪心思想
}
}
printf("%d\n",isOk==true?res-1:-1);//因为选择第一个服务器的时候res加一了,所以这时候需要减一
}
return 0;
}