题意

  • 生成m位所有位和为s的最大数和最小数

思路

  • 贪心:最大数为前面尽可能放9,最后剩下的不够9的放最后一位。最小数为后面尽可能放9,剩下的放前面,但如果有前导0,就给第一位加1,第一个非零位-1。这时发现,最小数其实就是最大数逆序然后改变前导0的结果
  • 注意:三种特殊情况,第一种全放9也凑不够S,第二种s=0且m>1,第三种s=0且m=0,前两种输出-1,最后一种输出0 0

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int m,s,num[120]={0};
        scanf("%d%d",&m,&s);
        if((s==0&&m>1)||s>9*m){
            printf("-1\n");
            continue;
        }
        if(m==1&&s==0){
            printf("0 0\n");
            continue;
        }        
        int i=0;
        for(i=m-1;s>0;i--){
            if(s>9){
                num[i]=9;
                s-=9;
            }else{
                num[i]=s;
                s=0;
            }   
        }
        num[i+1]--;num[0]++;
        for(int i=0;i<m;i++){
            printf("%d",num[i]);
        }
        printf(" ");
        num[i+1]++;num[0]--;
        for(int i=m-1;i>=0;i--){
            printf("%d",num[i]);
        }
        printf("\n");
    }
}