题目链接
https://ac.nowcoder.com/acm/contest/19306/1050
题目分析
因为要求最小编号,并且该编号是以读者的编号结尾,这边直接排序+翻转,找开头的数。
记录是因为看到某个大佬非常好的思路,直接对编号进行取模,就是末尾的数。
如果想得到末尾的数,直接进行取模即可~~
AC代码
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
string ids[1005];
// 找编码最小
bool cmp(string &a, string &b)
{
if (a.size() != b.size()) return a.size() < b.size();
for (int i = 0; i < a.size(); ++ i)
if (a[i] != b[i]) return a[i] < b[i];
return true;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++ i)
cin >> ids[i];
sort(ids, ids + n, cmp);
for (int i = 0; i < n; ++ i)
reverse(ids[i].begin(), ids[i].end());
string ne;
int sz = 0;
for (int i = 0; i < m; ++ i)
{
string ans;
cin >> sz >> ne;
int flag = false;
reverse(ne.begin(), ne.end());
for (int i = 0; i < n; ++ i)
if (ids[i].find(ne) == 0)
{
ans = ids[i], flag = true;
reverse(ans.begin(), ans.end());
break;
}
if (flag) cout << ans << endl;
else cout << -1 << endl;
}
return 0;
}
AC代码(看到的很棒的思路)
#include<bits/stdc++.h>
using namespace std;
const int N =1010;
int a[N];
int main()
{
int n,q;
cin>>n>>q;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
while(q--)
{
int x,y;
cin>>x>>y;
for(int i=0;i<=n;i++)
{
if(i == n) printf("-1\n");
else if(a[i] >= y && a[i] % (int)pow(10, x) == y)
{
printf("%d\n", a[i]);
break;
}
}
}
}
标签:NOIP2017,string,int,ne,ids,cin,管理员,size,刷题
From: https://www.cnblogs.com/ClockParadox43/p/17444061.html