首页 > 其他分享 >信息学奥赛一本通题目解析:1415:【17NOIP普及组】图书管理员(字符串)

信息学奥赛一本通题目解析:1415:【17NOIP普及组】图书管理员(字符串)

时间:2024-04-05 13:59:51浏览次数:23  
标签:17NOIP 编码 奥赛 23 1123 需求 读者 1415 图书

【题目描述】

图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数。 每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图 书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。 小 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

【提示】

第一位读者需要的书有 2123、1123、23,其中 23 是最小的图书编码。第二位读者需要 的书有 2123、1123,其中 1123 是最小的图书编码。对于第三位,第四位和第五位读者,没 有书的图书编码以他们的需求码结尾,即没有他们需要的书,输出-1。

【数据规模与约定】

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

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

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

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

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

【样例分析】

输入样例

5 5

2123

1123

23

24

24

2 23

3 123

3 124

2 12

2 12

  • 这里有5本书,它们的图书编码分别是21231123232424
  • 有5位读者,每位读者的需求码长度和需求码分别是:
    • 长度为2,需求码为23
    • 长度为3,需求码为123
    • 长度为3,需求码为124
    • 长度为2,需求码为12
    • 长度为2,需求码为12(重复)

处理过程

  1. 排序:根据编码长度和字典序排序后,图书编码顺序为23242411232123
  2. 第一位读者:需求码为23,匹配的图书编码是23(最小的匹配项)。
  3. 第二位读者:需求码为123,匹配的图书编码是1123(最小的匹配项)。
  4. 第三位读者:需求码为124,没有匹配的图书编码,输出-1
  5. 第四位读者:需求码为12,没有以12结尾的图书编码,输出-1
  6. 第五位读者:需求码再次为12,情况同第四位读者,输出-1

输出样例

23 1123 -1 -1 -1

直观分析

  • 第一位读者找到了以23结尾的最小图书编码23
  • 第二位读者找到了以123结尾的最小图书编码1123
  • 第三位读者没有找到以124结尾的图书编码。
  • 第四位和第五位读者由于没有书的编码以12结尾,所以也没有找到匹配的图书编码。

这个例子展示了程序如何根据每位读者的需求码查找和确定图书馆中编码以特定数字结尾的最小图书编码,如果不存在这样的图书编码,则输出-1

【解题思路】

  1. 字符串存储和比较:首先,将所有图书编码作为字符串读入并存储。这样做的好处是直接利用字符串来进行末尾匹配检查,避免了将图书编码从整数转换为字符串的步骤。

  2. 自定义排序:使用自定义的比较函数string_comp对图书编码进行排序。这个比较函数首先根据字符串的长度进行排序,如果长度相同,则根据字典顺序排序。这样确保了在遍历图书编码时,可以更快地找到匹配的最小编码,因为短的编码数值小,且排序后更容易匹配。

  3. 处理每个读者的需求:对于每位读者,读入需求码的长度和需求码本身。需求码的长度这里实际上是用不到的,因为是直接通过字符串进行末尾匹配的判断。

  4. 匹配和输出:通过遍历所有图书编码,并使用字符串的substr方法检查每个图书编码是否以需求码结尾。一旦找到第一个这样的图书编码,就输出该编码并停止搜索。如果没有找到任何匹配的图书编码,则输出-1。

  5. 优化:通过排序和直接以字符串形式处理编码,避免了不必要的数据类型转换,并简化了匹配逻辑。

【代码实现】

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

string book[1001]; // 存储图书编码的数组

// 自定义比较函数,先按长度排序,长度相同则按字典序排序
bool string_comp(string a, string b) {
    if (a.size() != b.size()) {
        return a.size() < b.size();
    }
    return a < b;
}

int main() {
    int n, q;
    cin >> n >> q; // 读入图书数量和读者数量
    for (int i = 0; i < n; i++) {
        cin >> book[i]; // 读入图书编码
    }
    // 根据自定义的比较函数对图书编码进行排序
    sort(book, book + n, string_comp);
    
    for (int i = 0; i < q; i++) {
        int len; // 读者需求码的长度,虽读入但未使用
        string num; // 读者的需求码
        cin >> len >> num;
        bool f = false; // 标记是否找到匹配的图书编码
        for (int j = 0; j < n; j++) {
            // 如果当前图书编码的长度小于需求码的长度,则跳过
            if (book[j].size() < len) {
                continue;
            } else {
                // 使用substr方法检查图书编码是否以需求码结尾
                if (book[j].substr(book[j].size() - len, len) == num) {
                    cout << book[j] << endl; // 输出匹配的图书编码
                    f = true; // 标记已找到
                    break; // 找到后即停止搜索
                }
            }
        }
        if (!f) { // 如果没有找到匹配的图书编码
            cout << -1 << endl; // 输出-1
        }
    }
    return 0;
}

标签:17NOIP,编码,奥赛,23,1123,需求,读者,1415,图书
From: https://blog.csdn.net/lan_in/article/details/137397189

相关文章

  • 信息学奥赛一本通题目解析:1204:爬楼梯(记忆化递归)
    【题目描述】树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。【输入】输入包含若干行,每行包含一个正整数N,代表楼梯级数,1≤N≤30。【......
  • 初三奥赛模拟测试3
    初三奥赛模拟测试3T1网格图开幕雷击,T1先做2h,糊了个玄学复杂度的做法,会被点叉相交的数据卡,不过数据水,放过去了。考虑正解,枚举正方形可能出现的情况,对于每个正方形,尝试从上一个正方形转移,经过一些预处理,可以做到$O(n)$转移。懒得写正解了,去看其他HZOIers的题解吧T2序......
  • 初三奥赛模拟测试3
    前言我们的\(Shadow\)又\(41\)秒\(AC\)\(T0\)啦!是的又换题了,大多数人都做过,但是我没做过啊\(qwq\)。于是从别的地方扒了\(4\)道题,前两道是\(NOIP\)模拟赛的题,后两道从\(NOI\)模拟赛扒来的,知识点根本不会\(qwq\)。比赛链接T1网络图点击查看题面部......
  • HZOI初三奥赛模拟测试3-T2
    \(HZOI\)初三奥赛模拟测试\(3-T2\)题目描述给定序列\(a_1,a_2,\dotsa_n\),现在可以选择删除一些数,使得删除后\(\sum[a_i=i]\)最大做题历程一下午就做了这一个题,打到最后才发现时间复杂度\(O(\frac{n^2}{2})\)过不去,没时间优化了,最后\(73pts\),赛时最高,好像因为我多剪......
  • 13.【初三奥赛模拟测试2】
    估计也打不了多少\(qwq\)\(\Huge终于不垫底了。qwq\)初三奥赛模拟测试2T1南题解一道概率期望。一般都是从\(n\)开始递推到\(0\)。假设我们现在有\(i\)种枪,那么期望次数\[\largef_i=f_{i+1}+\fracn{n-i}\]因为当前有\(i\)种可能买到已经买过的枪,\(n-i\)......
  • 初三奥赛模拟测试2
    前言比赛链接——南昌起义。这辈子第一次\(rk~1\)。\(T1:\)概率期望,本来没学过,现学的(蓝书没看懂,还是网上的博客好理解),然后发现毕竟\(T1\)没那么难,知道概率期望是啥还是能做的。\(T2:\)本来看\(T1\)概率期望想先开\(T2\)的,但是发现不会就去学概率期望了,后来发......
  • 信息学奥赛一本通:1146:判断字符串是否为回文
    【题目描述】输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。【输入】输入为一行字符串(字符串中没有空白字符,字符串长度不超过100)。【输出】如果字符串是回文,输出yes;否则,输出no。【输入样例】abcdedcba【输出样例】yes【参考程序......
  • 信息学奥赛一本通题目解析:2086:【22CSPJ普及组】乘方(pow)
    2086:【22CSPJ普及组】乘方(pow)题目描述小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数aaa和b......
  • 关于信息学奥赛中的一些做题思路
    观前须知Sugar_Cube的博客园主页背景介绍本文记录了笔者在刷题或比赛中运用到的一些做题思路可以适当参考正文LuoguP2048超级钢琴首先显然有\(\mathcal{O}(n^2)\)暴力枚举每个子段,然后选择其中前k大的那么可以发现有贪心策略:选择k次最大值那么考虑怎样求最大值想......
  • 初三奥赛模拟测试1
    初三奥赛模拟测试1\(T1\)回文\(0pts\)设\(f_{x_{1},y_{1},x_{2},y_{2}}\)表示从\((1,1)\)到\((x_{1},y_{1})\)结束的回文路径条数,其中\((x_{1},y_{1})\)关于最终形成的回文串的回文中心的对称点为\((x_{2},y_{2})\)。状态转移方程为\(f_{x_{1},y_{1},x_{2},y_{2......