1. 程式人生 > >NOIP2017-普及組復賽第2題 題解

NOIP2017-普及組復賽第2題 題解

需要 們的 class space desc 其中 超過 main out

Description

  圖書館中每本書都有一個圖書編碼,可以用於快速檢索圖書,這個圖書編碼是一個正整數。
  每位借書的讀者手中有一個需求碼,這個需求碼也是一個正整數。如果一本書的圖書編碼恰好以讀者的需求碼結尾,那麽這本書就是這位讀者所需要的。
  小 D剛剛當上圖書館的管理員,她知道圖書館裏所有書的圖書編碼,她請你幫她寫一個程序,對於每一位讀者,求出他所需要的書中圖書編碼最小的那本書,如果沒有他需要的書,請輸出-1。

Input

  輸入文件名為librarian.in。
  輸入文件的第一行,包含兩個正整數 n 和 q,以一個空格分開,分別代表圖書館裏書的數量和讀者的數量。
  接下來的n行,每行包含一個正整數,代表圖書館裏某本書的圖書編碼。
  接下來的q行,每行包含兩個正整數,以一個空格分開,第一個正整數代表圖書館裏讀者的需求碼的長度,第二個正整數代表讀者的需求碼。

Output

輸出文件名為librarian.out。
輸出文件有 q 行,每行包含一個整數,如果存在第 i 個讀者所需要的書,則在第 i 行輸出第i 個讀者所需要的書中圖書編碼最小的那本書的圖書編碼,否則輸出-1。

Sample Input

5 5 
2123 
1123 
23 
24 
24 
2 23 
3 123 
3 124 
2 12 
2 12

Sample Output

23 
1123 
-1 
-1 
-1 

Hint

【輸入輸出樣例1 說明】
第一位讀者需要的書有 2123、1123、23,其中23是最小的圖書編碼。第二位讀者需要的書有2123、1123,其中1123是最小的圖書編碼。對於第三位,第四位和第五位讀者,沒有書的圖書編碼以他們的需求碼結尾,即沒有他們需要的書,輸出-1。


【數據規模與約定】
對於20%的數據,1 ≤ n ≤ 2。
另有20%的數據,q = 1。
另有20%的數據,所有讀者的需求碼的長度均為 1。
另有20%的數據,所有的圖書編碼按從小到大的順序給出。
對於 100%的數據,1 ≤ n ≤ 1,000,1 ≤ q ≤ 1,000,所有的圖書編碼和需求碼均不超過10,000,000。

你們最喜歡的程序

#include<cstdio>
#include<algorithm>
using namespace std;
int dz[1001][2],bm[1001],ts[1001],ans[1001];//dz為讀者,bm為編碼,ts為取模位數,ans為保存符合的編碼 
inline int read();//快速讀入 

int main()
{
	int n,q,tot=0;
	n=read(),q=read();
	ts[0]=1;
	for(int i=1;i<=7;i++)
		ts[i]+=ts[i-1]*10;//生成取模數 
	for(int i=1;i<=n;i++)
		bm[i]=read();
	for(int i=1;i<=n;i++)
		dz[i][0]=read(),dz[i][1]=read();
	for(int i=1;i<=q;i++)
	{
		tot=0;//初始化 
		for(int j=1;j<=n;j++)
		{
			if(bm[j]%ts[dz[i][0]]==dz[i][1])//對編碼取模並判斷 
			{
				ans[tot]=bm[j];
				tot++;
			}
		}
			
		if(tot==0)//判斷是否有結果 
			puts("-1");
		else
		{
			std::sort(ans,ans+tot);//答案排序 
			printf("%d\n",ans[0]);
		}
		for(int k=1;k<=tot;k++)//初始化 
			ans[k]=0; 
	}
	return 0;
	
}

inline int read()//快速讀入 
{
	char c=getchar();
	int x=0,f=1;
	while(c>‘9‘||c<‘0‘)
	{
		if(c==‘-‘)
			f=-1;
		c=getchar();
	}
	while(c<=‘9‘&&c>=‘0‘)
	{
		x=x*10+c-‘0‘;
		c=getchar();
	}
	return x*f;
}
//版權所有 李錦成
//2017/11/25 

  

版權所有 李錦成
2017/11/25 

NOIP2017-普及組復賽第2題 題解