NOIP2017普及组★图书管理员

版权声明:本文为博主原创文章,不管你喜不喜欢都请在注明作者后转载~( ̄▽ ̄~) https://blog.csdn.net/C20190102/article/details/78549889

题目

图书管理员

  • (librarian.cpp/c/pas)
  • 1S
  • 10 * 10’
  • 传统
  • 256MB

【问题描述】

图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个
正整数。
每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图
书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。
小 D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写
一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他
需要的书,请输出-1。

【输入格式】

输入文件名为librarian.in。
输入文件的第一行,包含两个正整数n 和q,以一个空格分开,分别代表图书馆里
书的数量和读者的数量。
接下来的 n 行,每行包含一个正整数,代表图书馆里某本书的图书编码。
接下来的 q 行,每行包含两个正整数,以一个空格分开,第一个正整数代表图书馆
里读者的需求码的长度,第二个正整数代表读者的需求码。

【输出格式】

输出文件名为librarian.out。
输出文件有q 行,每行包含一个整数,如果存在第i 个读者所需要的书,则在第i
行输出第i 个读者所需要的书中图书编码最小的那本书的图书编码,否则输出-1。

【输入输出样例1】

librarian.in
5 5
2123
1123
23
24
24
2 23
3 123
3 124
2 12
2 12
librarian.out
23
1123
-1
-1
-1
见选手目录下的librarian /librarian1.in 和librarian/librarian1.ans。

【输入输出样例1 说明】

第一位读者需要的书有2123、1123、23,其中23 是最小的图书编码。第二位读者需要
的书有2123、1123,其中1123 是最小的图书编码。对于第三位,第四位和第五位读者,没
有书的图书编码以他们的需求码结尾,即没有他们需要的书,输出-1。

【输入输出样例2】

见选手目录下的librarian/librarian2.in 和librarian/librarian2.ans。

【数据规模与约定】

对于 20%的数据,1 ≤ n ≤ 2。
另有 20%的数据,q = 1。
另有 20%的数据,所有读者的需求码的长度均为1。
另有 20%的数据,所有的图书编码按从小到大的顺序给出。
对于 100%的数据,1 ≤ n ≤ 1,000,1 ≤ q ≤ 1,000,所有的图书编码和需求码均
不超过10,000,000。

分析

其实这道题不严谨:需求码可能有前导零。

所以我没有处理= =
直接排序过后把编码模 10l l 为需求码的长度)取出它的后l位比较即可。
Θ(N2)

代码

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}

#define MAXN 1000
int N,Q;
int num[MAXN+5];

int main()
{
    freopen("librarian.in" ,"r", stdin);
    freopen("librarian.out","w",stdout);
    N=read(),Q=read();
    for(int i=1;i<=N;i++)
        num[i]=read();
    sort(num+1,num+N+1);
    for(int i=1;i<=Q;i++)
    {
        int l=read(),x=read();
        bool f=1;
        for(int j=1;j<=N;j++)//枚举每个排序后的图书编号
        {
            if(num[j]<x) continue;
            if(num[j]%((int)pow(10,l))==x)
            {
                printf("%d\n",num[j]);
                f=0;
                break;
            }
        }
        if(f) printf("-1\n");
    }
}

猜你喜欢

转载自blog.csdn.net/C20190102/article/details/78549889