洛谷 P3955 图书管理员(模拟)

题目链接https://www.luogu.org/problemnew/show/P3955
题目大意:给你读者的需求码,让你在图书码里找以需求码结尾并且最小的,输出。
题目思路:对每一个需求码,遍历图书码看是否符合(这里用到取模)要求并记录最小值输出。
代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct Reader{
    int length;
    int data;//结构体储存
}b[1005];
int a[1005];
bool is_ok(int len,int x,int y){
    int a1[10],b1[10];
    memset(a1,-1,sizeof(a1));//习惯性赋值
    memset(b1,-1,sizeof(b1));
    int i=1;
    int c=len;//这个c其实没啥用,我为了调试时方便才加上的
    while(c--){
        a1[i]=x%10;
        b1[i]=y%10;
        if(a1[i]!=b1[i])//一旦有不同的就return 0
            return 0;
        x/=10;
        y/=10;
        i++;
    }
    //for(int j=1;j<=len;j++){//我开始想的是a1,b1求完才来判断,后来想到可以每求一个值  
                            //判断一下,有不同的直接就return 0了,也相当剪枝了哈哈
    //  if(a1[j]!=b1[j])
    //      return 0;
    //}
    return 1;
}
int main(){
    int n,q;
    scanf("%d %d",&n,&q);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);//读入
    }
    for(int i=0;i<q;i++){
        scanf("%d %d",&b[i].length,&b[i].data);//读入
    }
    int flag;//是否有匹配的
    int min;
    for(int i=0;i<q;i++){
        flag=0;//内层循环结束要更新一下
        min=10000000;//同上
        for(int j=0;j<n;j++){
            if(is_ok(b[i].length,a[j],b[i].data)){
                flag=1;
                if(a[j]<min){
                    min=a[j];
                }
            }
        }
        if(flag==1)
            printf("%d\n",min);//输出
        else
            printf("-1\n");
    }
return 0;
}

总结:模拟没啥好说的,就是细心。

猜你喜欢

转载自blog.csdn.net/yczhaoxun/article/details/79833714