题解 P3955 【图书管理员】

聪明的猪

2019-09-22 11:46:28

Solution

~~蒟蒻题解,dalao轻喷~~ # 整体思路 其实这道题还算比较简单(~~去你的~~),我们将其全部输入之后再一个一个处理,对比编码和需求码后将最小的分别对应地储存,时间复杂度大概为 $ \mathcal{O}\left( n^2 \right) $ 吧~~主要是我太蒻了~~。 # 核心代码详解 气势磅礴的头文件。 ```cpp #include <algorithm> // std::min #include <array> // std::array #include <cmath> // std::pow #include <iostream> // std::cin,std::cout,std::endl #include <limits> // std::numeric_limits #include <memory> // std::shared_ptr ``` 用来储存需求码的结构体。 ```cpp struct request { bool flag; // 标记是否找到了对应的图书编码 int len; // 需求码长度 long code, min; // 需求码和当前对应最小的图书编码 }; ``` 来一波数组。 ```cpp std::array<long, 1010> bookCode; // 图书编码 std::array<std::shared_ptr<request>, 1010> requestCode; // 需求码 ``` 以下缩进皆为main函数内。 气势磅礴的初始化。 ```cpp for (std::array<std::shared_ptr<request>, 1010>::iterator iter = requestCode.begin(); iter != requestCode.end(); iter++) // 使用了迭代器,其实没有什么卵用 { *iter = std::make_shared<request>(); (*iter)->len = 0; (*iter)->code = 0; (*iter)->min = (std::numeric_limits<long>::max)() - 1; // 将min设置为long的最大值 (*iter)->flag = false; } ``` 气势磅礴的输入。 ```cpp std::cin >> n >> q; for (std::array<long, 1010>::iterator iter = bookCode.begin(); iter != bookCode.begin() + n; iter++) // 然并卵 { std::cin >> *iter; } for (std::array<std::shared_ptr<request>, 1010>::iterator iter = requestCode.begin(); iter != requestCode.begin() + q; iter++) // 然并卵 { std::cin >> (*iter)->len >> (*iter)->code; } ``` 真正的核心代码。 ```cpp for (int i = 0; i < q; i++) // 需求码循环 { for (int j = 0; j < n; j++) // 图书编码循环 { if (bookCode.at(j) % static_cast<long>(std::pow(10, requestCode.at(i)->len)) == requestCode.at(i)->code) // 判断是否是需要的图书 { requestCode.at(i)->min = std::min(bookCode.at(j), requestCode.at(i)->min); // 选最小 requestCode.at(i)->flag = true; // 设为已有编码了 } } } ``` # 整体代码 拒绝抄袭,共创和谐洛谷 ```cpp #include <algorithm> #include <array> #include <cmath> #include <iostream> #include <limits> #include <memory> struct request { bool flag; int len; long code, min; }; std::array<long, 1010> bookCode; std::array<std::shared_ptr<request>, 1010> requestCode; int main(void) { int n = 0, q = 0; bookCode.fill(0); for (std::array<std::shared_ptr<request>, 1010>::iterator iter = requestCode.begin(); iter != requestCode.end(); iter++) { *iter = std::make_shared<request>(); (*iter)->len = 0; (*iter)->code = 0; (*iter)->min = (std::numeric_limits<long>::max)() - 1; (*iter)->flag = false; } std::cin >> n >> q; for (std::array<long, 1010>::iterator iter = bookCode.begin(); iter != bookCode.begin() + n; iter++) { std::cin >> *iter; } for (std::array<std::shared_ptr<request>, 1010>::iterator iter = requestCode.begin(); iter != requestCode.begin() + q; iter++) { std::cin >> (*iter)->len >> (*iter)->code; } for (int i = 0; i < q; i++) { for (int j = 0; j < n; j++) { if (bookCode.at(j) % static_cast<long>(std::pow(10, requestCode.at(i)->len)) == requestCode.at(i)->code) { requestCode.at(i)->min = std::min(bookCode.at(j), requestCode.at(i)->min); requestCode.at(i)->flag = true; } } } for (int i = 0; i < q; i++) { if (!(requestCode.at(i)->flag)) { std::cout << -1 << std::endl; } else { std::cout << requestCode.at(i)->min << std::endl; } } return 0; } ``` ~~A了这道题,祝你们成功~~