【NOIP 2017普及グループ】図書管理者


【NOIP 2017普及グループ】図書管理者


タイトルの説明


図書館には本ごとに図書コードがあり、図書を迅速に検索するために使用することができます.この図書コードは正の整数です.本を借りた読者一人一人の手には需要コードがあり、この需要コードも正の整数です.もし1冊の本の図書コードがちょうど読者の需要コードで終わるならば、この本はこの読者が必要とするものです.Dさんは図書館の管理人になったばかりで、彼女は図書館のすべての本の図書のコードを知っていて、彼女はあなたにプログラムを書いてもらって、すべての読者に対して、彼の必要な本の中で図書のコードが一番小さい本を求めて、もし彼の必要な本がなければ、-1を出力してください.

にゅうしゅつりょくけいしき


入力形式:


入力ファイルの最初の行は、2つの正の整数nとqを含み、図書館の本の数と読者の数をそれぞれ表すスペースで区切られています.
次のn行は、各行に正の整数が含まれており、図書館のある本の図書コードを表しています.
次のq行は、各行に2つの正の整数を含み、1つのスペースで分けられ、1つ目の正の整数は図書館の読者の需要コードの長さを表し、2つ目の正の整数は読者の需要コードを表す.

出力フォーマット:


出力ファイルにはq行があり、各行には整数が含まれており、i番目の読者が必要とする本が存在する場合、i番目の読者が必要とする本の中で図書コードが最も小さい本の図書コードが出力され、そうでなければ-1が出力される.

入出力サンプル


サンプル#1を入力:
5 5 2123 1123 23 24 24 2 23 3 123 3 124 2 12
出力サンプル#1:
23 1123 -1 -1 -1

【テーマ解析】


この問題は難易度も高いと思いますが、その一つのポイントはソートでしょう.「i番目の読者が必要とする本の中で図書コードが一番小さい本の図書コード」を出力することです.ここから、コードを入力した後、コードをソートして、暴力的に列挙して、解を見つけることができます.しかし、コードを書くときは、細心の注意を払わなければなりません.私のようにnumの値を更新するのを忘れ、変数を繰り返したので、100点を無駄に失いました.--
#include
#include
#include
using namespace std;
int n,q;
bool f=0;
int book[1005];
struct node
{
    int len;
    int bh;
}fam[1005];
int main()
{
    freopen("librarian.in","r",stdin);
    freopen("librarian.out","w",stdout);
    scanf("%d %d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%d",&book[i]);
    sort(book+1,book+n+1);
    int num=1;
    for(int i=1;i<=q;i++)
    {
    scanf("%d %d",&fam[i].len,&fam[i].bh);
    num=1;// 
    for(int j=1;j<=fam[i].len;j++)
    num*=10;
    fam[i].len=num;
    }
    for(int j=1;j<=q;j++)
    {
        f=0;
    for(int i=1;i<=n;i++)
    {
        if(book[i]==fam[j].bh&&!f) {printf("%d
"
,book[i]);f=1;} else if(book[i]>fam[j].bh&&book[i]%fam[j].len==fam[j].bh&&!f) {printf("%d
"
,book[i]);f=1;} } if(!f) {printf("-1
"
);} } return 0; }