小明的数字表51nod求解答

课堂练习:小明的数字表 未完成
小明现在爱上了查询,他遇到了这样一个查询问题,给出 n 个数 (n<=100000),
有 q 个查询 (q<=100000),每组查询 3 个数:u v w,表示查找第 u 位 (个位为第1位,十位为第2位,依此类推)为数字 v 的所有数字中,第 w 小的数,如果这个数字不存在,输出“-1”。

注:不考虑所有数字中的前导 0。

输入格式
第一行输入一个n(n<=100000),表示数列的长度; 第二行n个正整数ai(0<=ai<=100000000); 第三行一个数字q(q<=100000)表示询问的次数; 下面q行,每行给出三个数字u,v,w,表示查找第u位为数字v的所有数字中,第w小的数。
输出格式
每个询问输出一个数字,查询不到输出“-1”。
输入样例
4
1 21 22 3
3
2 2 2
1 1 2
2 2 3
输出样例
22
21
-1
数据范围
n<=100000 0<=ai<=100000000 q<=100000
样例解释
第2位数字为2的数字包括 (21,22) 第 2 小的数字为22;

第1位数字为1的数字包括 (1,21) 第2小的数字为21;

第2位数字为2的数字包括 (21,22) 第3小的数字不存在,输出“-1”

解答如下

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int f(int n,int p)//返回n的第p位
{
    char a[10];
    itoa(n,a,10);
    reverse(a,a+strlen(a));
    int r=a[p-1]-48;
    return r;
}
int main()
{
    int n,p,j,u,v,w,t[100000],q,fz[100000],h=0;
    cin >> n;
    for(j=0; j<n; j++)
    {
        cin >> t[j];
    }
    cin >> q;
    while(q--)
    {
        h=0;
        cin >> u>>v >>w;
        for(j=0; j<n; j++)
            if(f(t[j],u)==v)
                fz[h++]=t[j];
          sort(fz,fz+h);      
    if(w<=h)
        cout << fz[w-1] << endl;
    else
        cout << -1 << endl; 
    }
    return 1;
}