算法刷题记录:[NOIP2017]图书管理员

发布时间 2023-05-30 18:29:05作者: 想个昵称好难ABCD

题目链接

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;
            }
        }
    }
}