复赛二:图书管理员(librarian)

洛谷:P3955 
OJ: 4956

关键点说明

  1. 数组索引从 1 开始:在代码中,数组 b[]x[]xc[]tmp[] 的索引均从 1 开始。这需要在所有的循环和操作中保持一致,避免索引越界或数据错误。
  2. 排序的重要性:对书的编码进行排序后,可以确保在遍历时,最先找到的符合条件的编码就是最小的,无需继续遍历后续的编码。
  3. 取模运算获取后缀:使用 b[j] % tmp[i] 可以高效地获取书的编码的后 xc[i] 位数字,避免了将数字转换为字符串再截取的复杂操作。
  4. 提前判断编码长度:在内层循环中,添加了对书的编码长度的判断(b[j] < tmp[i] / 10),可以减少不必要的计算,提高程序效率。
  5. 标志变量 found:使用布尔变量 found 来判断是否找到符合条件的图书编码,逻辑清晰,避免了多余的条件判断。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**************************************************************** 
 * Description: 2017年普及组第二题   图书管理员librarian
 * Author: Alex Li
 * Date: 2024-09-24 11:12:09
 * LastEditTime: 2024-10-02 09:12:53
****************************************************************/
#include <iostream>
#include <cstdio>
#include <algorithm> // 包含常用算法函数,例如 sort、max、min 等
using namespace std;

const int S = 1005;
long long b[S], x[S], tmp[S], xc[S]; // b[]:书的编码,x[]:需求码,xc[]:需求码的长度,tmp[]:用于计算 10 的幂次
int n, q;

int main() {
    cin >> n >> q; // 输入图书数量 n 和读者数量 q

    // 初始化 tmp[] 数组,使每个元素初始为 1
    for (int i = 1; i <= S; i++)
        tmp[i] = 1;

    // 读取 n 本书的编码,存储在 b[1...n] 中
    for (int i = 1; i <= n; i++)
        cin >> b[i];

    // 对书的编码进行排序,以便后续找到最小的符合条件的编码
    sort(b + 1, b + n + 1); // 注意这里应该是 b + 1 到 b + n + 1,因为 b[0] 未使用

    // 读取 q 个读者的需求码长度和需求码,并计算对应的 10 的幂次存入 tmp[]
    for (int i = 1; i <= q; i++) {
        cin >> xc[i] >> x[i]; // xc[i]:需求码的长度,x[i]:需求码

        // 计算 10 的 xc[i] 次幂,存储在 tmp[i] 中
        for (int j = 1; j <= xc[i]; j++)
            tmp[i] *= 10; // tmp[i] = 10 ^ xc[i]
    }

    // 对每个读者,寻找符合条件的最小图书编码
    for (int i = 1; i <= q; i++) {
        bool found = false; // 标记是否找到符合条件的图书
        for (int j = 1; j <= n; j++) {
            // 取书的编码的末 xc[i] 位,判断是否等于需求码 x[i]
            if (b[j] % tmp[i] == x[i]) { // b[j] % tmp[i] 取 b[j] 的后 xc[i] 位数字
                cout << b[j] << endl; // 输出找到的最小图书编码
                found = true;
                break; // 找到后跳出循环
            }
        }
        if (!found) {
            cout << "-1" << endl; // 未找到符合条件的图书,输出 -1
        }
    }
    return 0;
}
Scroll to Top