题解 | #[NOIP2017]图书管理员#
[NOIP2017]图书管理员
https://ac.nowcoder.com/acm/problem/16422
思路
- 使用快排
quick_sort
进行从小到大排序 - 遍历数组,使用 mod 计算最后
len
位是否匹配,如果匹配则输出;如果遍历结束没有匹配,输出-1。
代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
void quick_sort(vector<int>& nums, int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1;
int x = nums[(l + r) / 2];
while (i < j) {
do i++; while (nums[i] < x);
do j--; while (nums[j] > x);
if (i < j) swap(nums[i], nums[j]);
}
quick_sort(nums, l, j), quick_sort(nums, j + 1, r);
}
int main() {
int n, q;
cin >> n >> q;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
quick_sort(nums, 0, n - 1);
int len, need;
for (int i = 0; i < q; i++) {
cin >> len >> need;
int j = 0, mod = pow(10, len);
for (; j < n; j++) {
if (nums[j] % mod == need) {
cout << nums[j] << endl;
break;
}
}
if (j == n) {
cout << -1 << endl;
}
}
return 0;
}