洛谷:P3955
OJ: 4956
b[]
、x[]
、xc[]
、tmp[]
的索引均从 1 开始。这需要在所有的循环和操作中保持一致,避免索引越界或数据错误。b[j] % tmp[i]
可以高效地获取书的编码的后 xc[i]
位数字,避免了将数字转换为字符串再截取的复杂操作。b[j] < tmp[i] / 10
),可以减少不必要的计算,提高程序效率。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; } |