一句话题意
分别找出长度为n,每位数字和恰好为m的最小数和最大数,如果找不到输出”-1 -1“
思维
怎么确保构造的数最小/大?
怎么确保数字和恰好为m?
实施
遍历每一位,贪心地选取最大/最小的数,直到接下来的数字不足以贪心
细节
1.没有前导零
2.数字和恰好为m
3.注意边界特判
code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
if(m==0)
{
if(n==1) puts("0 0");
else puts("-1 -1");
return 0;
}
int m1=m,m2=m;
string s1,s2;
int flag1=0,flag2=0;
for(int j=1;j<=9;j++)
{
if(m1-j<=(n-1)*9)
{
flag1=1;
s1+=(j+'0');
m1-=j;
break;
}
}
for(int j=9;j>=1;j--)
{
if(m2-j>=0)
{
flag2=1;
s2+=(j+'0');
m2-=j;
break;
}
}
if(flag1&&flag2)
{
for(int i=2;i<=n;i++)
{
if(m1==(n-i+1)*9&&flag1)
{
flag1=0;
for(int j=i;j<=n;j++) s1+='9';
}
if(m2==0&&flag2)
{
flag2=0;
for(int j=i;j<=n;j++) s2+='0';
}
if(flag1)
for(int j=0;j<=9;j++)
{
if(m1-j<=(n-i)*9)
{
m1-=j;
s1+=(j+'0');
break;
}
}
if(flag2)
for(int j=9;j>=0;j--)
{
if(m2-j>=0)
{
m2-=j;
s2+=(j+'0');
break;
}
}
}
cout<<s1<<" "<<s2;
}
else puts("-1 -1");
return 0;
}
标签:Digits,...,Given,数字,int,s2,flag2,m2
From: https://www.cnblogs.com/pure4knowledge/p/18235486