官方题解
2024-03-21 16:55:04
发布于:浙江
143阅读
0回复
0点赞
【算法分析】
用数组存最大值和最小值的各个位,最大值的各个位从左往右优先取 。最小值的首位,可以假设其它位取 则首位最小能取多少,要注意首位不能取0,最小值的其它位也可以按照这个思路。
【参考代码】
#include <iostream>
#include <algorithm>
using namespace std;
int a[110], b[110];
int main() {
int m, s;
cin >> m >> s;
int t = s, p = s;
if(m == 1&& s == 0){
cout << 0 << " " << 0;
return 0;
}
for (int i = 1; i <= m; i++) { //最大整数
if (t >= 9) { //t大于等于9则取最大的9
a[i] = 9;
t -= 9;
}
else { //否则取t
a[i] = t;
t = 0;
}
}
for (int i = 1; i <= m; i++) { //最小整数
if (i == 1) { //首位不能是0
int y = s - (m - 1) * 9; //除首位外其它位取9,则首位最小能取 s-(m-1)*9
if (y > 0) { //y大于0,首位取y
b[i] = y;
s -= y;
}
else { //否则首位取1
b[i] = 1;
s -= 1;
}
}
else {
int y = s - (m - i) * 9; //从左往右第i位,i右边的位上取9,则i位最小能取 y=s-(m-i)*9
if (y > 0) { //y大于0,直接取y
b[i] = y;
s -= y;
}
else { //y小于等于0,说明i右边的位不能全部取9,i位最小能取0
b[i] = 0;
}
}
}
if (m * 9 < p || p < 0 || p == 0 && m>1) { //所有位取9,各个位上的和仍小于p 、p小于0、各个位上的和为0,m>1均不满足
m = 1;
a[1] = -1, b[1] = -1;
}
for (int i = 1; i <= m; i++) {
cout << b[i];
}
cout << " ";
for (int i = 1; i <= m; i++) {
cout << a[i];
}
return 0;
}
【时间复杂度】
【预计得分】
这里空空如也
有帮助,赞一个