题意(Given Length and Sum of Digits..):
给出字符串长度len 及个字符总和m , 求总和 == m 的最大及最小字符串(仅包含数字且不含前导零), 不存在则输出 -1,-1。
思路:
特判:n个数之和存在最大值及最小值,若 max < m || min > m, 说明不存在答案, 输出-1, -1,否则必然两个都存在(也可能两个值相同);
对于最大值的求解:先取最大可能(如len == 5, max == 99999, 此时总和sum == 45), 将其与m 比较, 为满足最大值条件故从低位向高位运算, 根据m - sum 的值进行相应操作直到两者相等(最小值同理)。
while (sum1 <= m) {
if (sum1 == m) {
break;
}//可能一开始就相等
int t = m - sum1;
if (t > 9) {
s1[len1--] = '9';
sum1 += 9;
}
else {
s1[len1] = (t + s1[len1]);
break;
}
}
代码:
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define PII pair<int, int>
#define PLL pair<long, long>
typedef long long ll;
const int N = 1e5 + 7;
#define lowbit(x) (x & (-x))
ll rs(ll p) {return p << 1 | 1;}
ll ls(ll p) {return p << 1;}
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
int main() {
int n, m; cin >> n >> m;
string s1 = "1", s2 = "9";
int sum1 = 1, sum2 = 9;
int len1 = n - 1, len2 = n - 1;
for (int i = 2; i <= n; i++) {
sum2 += 9;
s1 += "0";
s2 += "9";
}
if (n == 1) sum1 = 0, s1 = "0";
if (sum2 < m || sum1 > m) {
cout << -1 << " " << -1;
return 0;
}
while (sum1 <= m) {
if (sum1 == m) {
break;
}//可能一开始就相等
int t = m - sum1;
if (t > 9) {
s1[len1--] = '9';
sum1 += 9;
}
else {
s1[len1] = (t + s1[len1]);
break;
}
}
while (sum2 >= m) {
if (sum2 == m) {
break;
}
int t = sum2 - m;
if (t > 9) {
s2[len2--] = '0';
sum2 -= 9;
}
else {
s2[len2] = (s2[len2] - t);
break;
}
}
cout << s1 << " " << s2 << endl;
return 0;
}