题解 CF1462C 【Unique Number】

Griseo_nya

2021-02-01 14:50:44

Solution

这道题的题目很明显的告诉了我们要贪心 。 首先,题目要求我们“找出符合条件的最小数”,而这道题中各个数位填什么对下一位填的数几乎没有关系(除了你不能再用这个数),故知道我们可以用贪心的方法来解决这道题。 那么下面就该想:怎么贪心呢? 明显在 $x<10$ 时直接输出 $x$ 就可以,因为多位明显是会比一位的数大的。 因为题目要求我们各位数字不能重复,所以我们能取到的最大的 $x$ 就是 $0+1+2+3+4+5+6+7+8+9=45 $ 所以当 $x>45$ 时就无法取到,直接输出 $-1$ 即可。 其余的数我们可以用贪心的思路(前面说过了我们要这样啊): 从大往小,依次从大往小填数,每次给 $x$ 减去本位要填的数,当本位应填的数大于 $x$ 时,就停止循环,并且输出每一位就ok啦☆ 那么下面就是代码啦: ```cpp #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; } ```