P11059 [入门赛 #27] 数字 (Hard Ver.) 题解

· · 题解

题目大意

求出一个 n 位数 x,满足以下两个条件:

  1. 已经满足 1 的情况下,x 的值尽可能小。

题目思路

先特殊判断各位数之和最大,也就是 n9 是否小于 p,如果是,就先输出 1 后面加 n-10。\ 否则就从末尾开始,尽可能的放最大的数,换句话说,如果 p \le 9, 这一位就放 p-1,留着放在首位,否则这一位就是 9

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,p,a[1000001];
    cin >> n >> p;
    int k=n*9;
    if(k<p){//特判
        cout << 1;
        for(int i=1;i<=n-1;i++) cout << 0;
        return 0;
    }
    for(int i=n;i>=1;i--){//从末尾开始放
        if(i!=1){//如果不是首位
            if(p==1) a[i]=0;//还要留给第一位
            if(p>9){//大于9,直接放9
                a[i]=9;
                p-=9;
            }else{//留一位
                a[i]=p-1;
                p=1;
            }
        }else{
            a[i]=p;
        }

    }
    for(int i=1;i<=n;i++) cout << a[i];
    return 0;
}