【题解】P3955 [NOIP2017 普及组] 图书管理员

· · 题解

这题看着挺简单的,其实也挺简单的。

我们用 book 数组来维护图书编码,用 len 数组来维护需求码的长度,用 num 数组维护需求码。

那么每次枚举书的编码,求 num_i 的后 x 位数,然后比对是否是对应的需求码,如果是的话那么判断一下是否最小,如果是,就更新 ans 变量,最后输出 ans 即可。

那么怎么求 x 呢?可以发现,我们要求后 x 位,那么就是 num_j(j \le n)10^x 取余!

最后还要特判一下,是否输出 -1 即可。

#include<bits/stdc++.h>
using namespace std;
const int N=5000+5;
const int M=1e9+5;
int book[N],len[N],num[N];
int main(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++) cin>>book[i];
    for(int i=1;i<=q;i++){
        cin>>len[i]>>num[i];
        int cnt=pow(10,len[i]);
        int minn=M;
        for(int j=1;j<=n;j++){
            if(book[j]%cnt==num[i] && book[j]<minn){
                minn=book[j];
            }
        } 
        if(minn!=M) cout<<minn<<endl;//特判
        else cout<<-1<<endl;
    } 
    return 0;
}