P3955 [NOIP2017 普及组] 图书管理员
题意&分析
题意
给定 n n n 个数, q q q 次查询。
每次查询给出数字的长度 l e n len len,以及数字 n u m num num,寻找 n n n 个数中末尾的 l e n len len 个数字是否与数字 n u m num num 相等,如果相等输出最小值的一个数,否则输出 − 1 -1 −1。
前置知识
设定有一个字符串 s s s,整型类型 n u m num num;
-
s.size()
获取该字符串 s s s 的长度。 -
s.substr( pos, len )
获取字符串 s s s 下标从pos
开始,长度为len
的子串,如果len
不填写则默认从pos
截取到末尾的子串。 -
to_string( num )
将整型类型 n u m num num 转为字符串类型。
分析
(~~没有分析,~~纯模拟,看注释)
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, inf = 1e8;
int n, q;
int id[N];
int main() {
cin >> n >> q;
for (int i = 1; i <= n; i++)
cin >> id[i];
while (q--) {
int len; string num;
cin >> len >> num;
int res = inf; // 答案,求最小初始化最大值
for (int i = 1; i <= n; i++) { // 扫一遍
string s = to_string( id[i] ); // 将数字 转-> 字符串
if ( s.size() >= len && s.substr( s.size() - len ) == num ) // 足够长度 && 截取最后长度为 len 个字符 判断
res = min( res, id[i] ); // 如果都相等则判断,值小的作为答案
}
if ( res == inf ) res = -1; // 扫一遍后都更新不到,则没有答案,标记为 -1
cout << res << endl;
}
return 0;
}