【牛客网计算机历年考研复试上机题】恶心题目篇1 -- 代理服务器

这道题,说真的恶心到我了,并没有运用任何算法,没有运用任何函数,结构啥的,只是单纯的一个类似于贪心的步长问题,我做了一下午,历次做错主题思路和正确答案基本一致,只不过我的错误思路太过于混乱,脑袋疼,不过,不得不说正确答案确实巧妙。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误思路:
这里一定要说一下我的错误思路,真的是太伤脑筋了,因为这个我想的是在整个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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值