专栏文章

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

P3955题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqkxllp
此快照首次捕获于
2025/12/04 06:29
3 个月前
此快照最后确认于
2025/12/04 06:29
3 个月前
查看原文
这题看着挺简单的,其实也挺简单的。
我们用 bookbook 数组来维护图书编码,用 lenlen 数组来维护需求码的长度,用 numnum 数组维护需求码。
那么每次枚举书的编码,求 numinum_i 的后 xx 位数,然后比对是否是对应的需求码,如果是的话那么判断一下是否最小,如果是,就更新 ansans 变量,最后输出 ansans 即可。
那么怎么求 xx 呢?可以发现,我们要求后 xx 位,那么就是 numj(jn)num_j(j \le n)10x10^x 取余!
最后还要特判一下,是否输出 1-1 即可。
CPP
#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;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...