记第一篇题解(NOIP2017普及组 图书管理员)

星空璀璨的夜晚,调色板上绘出蓝与灰。
你用深邃的双眼望向夏日的天空,
山坡上的阴影衬托出水仙花的轮廓,
捕捉微风和冬日的寒冷,雪地上斑驳的色彩。
直到现在我才明白,你想对我说些什么,
你为理智所付出的代价,你如何从中解脱。
其他人却不予理会,他们也不知道如何面对——
也许现在他们会知道。
  ——《Vincent》,美国民歌手唐·麦克林 

介绍:此题为NOIP2017普及组T2,一道非常简单的模拟,但启发了许多。

题目描述

图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。 每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。 小 D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他需要的书,请输出−1。

输入格式

第一行,包含两个正整数 n,q,以一个空格分开,分别代表图书馆里 书的数量和读者的数量。

接下来的 n 行,每行包含一个正整数,代表图书馆里某本书的图书编码。

接下来的 q 行,每行包含两个正整数,以一个空格分开,第一个正整数代表图书馆 里读者的需求码的长度,第二个正整数代表读者的需求码。

输出格式

q 行,每行包含一个整数,如果存在第 i  个读者所需要的书,则在第 i 行输出第 i 个读者所需要的书中图书编码最小的那本书的图书编码,否则输出−1。

输入样例

5 5 
2123 
1123 
23 
24 
24 
2 23 
3 123 
3 124 
2 12 
2 12

输出样例

23 
1123 
-1 
-1 
-1 

说明/提示

【数据规模与约定】

对于 20%的数据,1≤n≤2。

另有 20%的数据,q=1。

另有 20%的数据,所有读者的需求码的长度均为 11。

另有 20%的数据,所有的图书编码按从小到大的顺序给出。

对于 100%的数据,1≤1,000,1≤q≤1,000,所有的图书编码和需求码均 不超过 10,000,000。

思路:

洛谷上给出的标签是"字符串",对此只能作参考,因为此题用字符串来做无疑太过复杂,且容易混淆。此题整体思想就是模拟。先读取书的编号将它存入int类型的数组,由于此题是让求最小的,所以我们可以sort排序,这样对于后续的操作会更加的方便。考虑到空间时间复杂度问题,我们可以一边读入读者的需求,一边判断,一边输出,而不是全部求出后再一次性输出(一开始本人就是这么做的)。从书的编号中找出存在第1-q位尾数满足读者需求,然后如果有就直接输出(我们前面已经将书的编号从小到大排序了,所以最小的就是第一个)然后break就行,如果到最后一个编号还是没有符合要求的,那么就直接输出"-1"即可。由于不是采用的字符串,而是整数类型的,所以我们可以采用取模的思想,但是重复取模又过于麻烦,所以,我们可以用一个数组,存放%运算符后面的数,此题的数据范围是到10,000,000,那么这个数组从1开始,每次乘10倍,就需要我们初始化这个数组。

具体代码如下:

//#include<cstdio> 比赛中,建议带上这个头文件,因为要用到文件输入输出
#include<bits/stdc++.h> //万能头文件
using namespace std;
int m[8]={1,10,100,1000,10000,100000,1000000,10000000};//初始化%后面要用到的数组
int n,q;
int b[1005];//记录图书编号的数组
int main(){
    cin>>n>>q;
    for(int i=0;i<n;i++) cin>>b[i];
    sort(b,b+n);//sort从小到大排序
    while(q--){
        int l,n;
        cin>>l>>n;
        int a=-1;      //初始值设置为-1,没有符合题意的直接输出a的值为-1,有的话下面会更新a的值
        for(int i=0;i<n;i++){
            int g=b[i]%m[l];  //直接带入数组,少了一个循环,更加方便
            if(g==n){          //判断是否有尾数相等的
                a=b[i];        //找到符合需求的最小值,将它赋值给a
                break;         //停止这个for循环,开始下一个
            }
        }
        cout<<a;   //总而言之,最后输出a
    }
    return 0;
}

其实,这是一个难度非常小的水题,但是之所以选择在2月的最后一天,写出它来,是因为想了很多,所以这不仅是一篇题解,更是一篇有私人情感的自我反思。

2月26日,也就是两天前。下午,一行人进入403机房学习,其中就包括我们5个人:ljh、fml、jx、wh以及我。当时我发现fml正在研究此题,于是我就盯上了它,这就是这道题的由来。但是jx呢,就很摆,因为5个人中,只有它和ljh不需要面临那时5天后的“折磨”,即今日2月28日的三天后将要面临的“折磨”。两天后的现在,我也只能记起那个下午特别困倦(可能是因为上午拍摄,后续再说),加上机房内前后两台热空调的夹击,想睡觉,是我唯一的记忆。由于我十分的困,所以刚开始只能做三档次上的一些水题来提提神,然后这道题"图书管理员",贯穿了我的一整个下午,首先我的思路上肯定是没有问题的,但是怎样简化代码,怎样让它不容易混淆,成了一个问题。

当我想到一半时,ljh向我们几人展示了他的"图书管理系统",程序大体是这样的:输入借阅者的姓名、电话以及要借阅的书籍,然后此程序运用了windows.h来调用当前时间,开发者可以自行设置借阅时长,然后运行后就会开始计时,等计时到借阅时长后,就会提醒你该还书了。看似简单的逻辑背后,其实代码量还是多的,我可以大体猜到他的灵感来自于这道"图书管理员",从星期四到那个周日的下午实现了这个程序,并且完成了说明书。

看完演示后,我放下了手中的这道题,开始了深度的思考交流,我提出了个想法,我也要用这个做出有益的东西,于是我们展开了为什么要学习这个的交流。有一次jx跟我说她现在已经放弃了靠这个升学,只是把这个当成自己的兴趣爱好而已。我的回答是从一开始我就没有想过靠这个升学,因为我知道我根本不可能做到。从最初踏进403机房的那天我就应该想到这个的水有多么“深”,它涉及的体系太庞大了,尤其是与数学密不可分,所以平时都称这个过程为"在电脑上解数学",因为真正意义上的编程只是一部分,也就是“语言入门”,而剩下的,几乎都是算法,我愿称之它为“数学”,所以某人从学习了这个后,数学成绩蹭蹭往上,而我......是一个很奇怪的人,从七年级到八年级,无论每次数学是多难或多简单,我一直保持着下降状态(这个可不是说笑,很严肃)。扯远了。总而言之,我自己也不确定自己是一个算法爱好者,还是喜欢OI竞技运动,只知道我喜欢做出每道题后的感觉。以前我认为我热爱竞技体育,所以我大概是喜欢OI吧,但是我发现我真正擅长的并不是OI。OI就像我们平时的考试,看不到成绩,无法根据反馈结果而更改。无论是考试、OI、还是某项手抄报活动的提交,你在过程中不知道结果,只能等待反馈的结果,这种结果貌似不是我想要的,所以我又认为自己只是一个算法爱好者,对比之下还是更喜欢OJ或IOI。无疑,我是矛盾的。

这两天我疯了般在考虑要做一个什么样的东西,每次一有新想法总是一惊一乍,但不久后又把自己推翻了。说点题外话,今日之跳绳比赛,让我在放学途中的反思中起了一身鸡皮疙瘩,算是一个耻辱吧,只有自己真正水平取得的成绩才能算作耻辱。当然,对于3天后将要面临的折磨,我还是会担心爆零、遇到没学过的算法等等,就像考试前我会担心书没背过、题不会做,就像跳绳比赛前我也会担心自己出现失误,然而后面两个都被我碰到了,3天后第一个也会与我见面吗?Anyway,对此我只能表示期待,来吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FFTcwlath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值