这道题的题目很明显的告诉了我们要贪心 。 首先,题目要求我们“找出符合条件的最小数”,而这道题中各个数位填什么对下一位填的数几乎没有关系(除了你不能再用这个数),故知道我们可以用贪心的方法来解决这道题。

那么下面就该想:怎么贪心呢?

明显在 $x<10$ 时直接输出 $x$ 就可以,因为多位明显是会比一位的数大的。

因为题目要求我们各位数字不能重复,所以我们能取到的最大的 $x$ 就是 $0+1+2+3+4+5+6+7+8+9=45 $ 所以当 $x>45$ 时就无法取到,直接输出 $-1$ 即可。

其余的数我们可以用贪心的思路(前面说过了我们要这样啊):

从大往小,依次从大往小填数,每次给 $x$ 减去本位要填的数,当本位应填的数大于 $x$ 时,就停止循环,并且输出每一位就ok啦☆

那么下面就是代码啦:

#include <bits/stdc++.h>
using namespace std;
int t;
int main(){
    cin>>t;
    while(t--){
        int x;
        cin>>x;
        if(x<10)cout<<x<<endl;              //预处理 x<10 的情况
        else if(x>45)cout<<-1<<endl;        //预处理 x>45 的情况
        else{
            int i;
            vector<int> a;                  //开一个 vector ,可以理解为动态数组
            for(i=1;i<=9;i++){
                int now=10-i;               //当前应填的数字
                if(now>=x){
                    cout<<x;   
                    //x 即是我们当前应填的最高位,所以可以直接输出
                    reverse(a.begin(),a.end()); 
                    //因为我们是从后往前填的,所以要反转一下
                    for(int i=0;i<a.size();i++){
                        cout<<a[i];         //输出之前的每位数字
                    }
                    cout<<endl;             //换行
                    break;                  //本次循环结束
                }
                else {
                    x-=now;                 //给剩余的 x 减去当位应填的数
                    a.push_back(now);       //把这位数放进数组里
                }
            }
        }

    }
    return 0;
}