刚开始自己的思路:用dfs暴搜,没考虑时间复杂度(准确来说当时不知道该题的时间复杂度该怎么算),如果用暴搜写的话是(10的100次方)
正确的思路:最小值:定义一个长度为m的空字符串,从最后一位开始遍历每一位尽量填9,当s不足9时,且当前还没遍历到第一位时,填s-1,要保证第一位有数,最小为1。
最大值:从前往后遍历,每一位尽量填9,当后边s为0时,所有数填0,这样可以保证该数最大。
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int N = 110;
int m,s;
int main()
{
cin>>m>>s;
if(s>m*9 || (s==0&&m>1) ) puts("-1 -1");
else
{
string a(m,' ') , b(m,' ');
int sum=s;
for(int i=m-1;i>0;i--)
{
int t=min(9,sum-1);
a[i]=t+'0';
sum-=t;
}
a[0]=sum+'0';
sum=s;
for(int i=0;i<m;i++)
{
int t=min(9,sum);
b[i]=t+'0';
sum-=t;
}
cout<<a<<" "<<b<<endl;
}
return 0;
}