思路:
贪心:疯狂取 $9$ 就行了,保证数码值最大。
只要把 $a$ 给处理完,那么 $b$ 就是 $n-a$ 了。
详细的解释请看代码注释。
AC CODE:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x,b,val=0;//m 和 x 都是 n 的替身,防止 n 的值改变; val 是 a 和 b 的数码值
signed main(){
cin>>n;
m=x=n;//复制
while(x>=10)x/=10;//求出 n 的首位
int a=x-1;//想一下为什么 a 要先赋值为 x-1(思考题)
while(m){//求出 a 的最优解
m/=10;
a=a*10+9;
}
a/=10;//多乘的要除回来
b=n-a;//b=n-a
while(a){
val+=a%10;
a/=10;
}//a 的数码和
while(b){
val+=b%10;
b/=10;
}//b 的数码和
cout<<val<<endl;//输出
return 0;//结束程序
}
思考题答案:
为了保证 $a$ 和 $b$ 的数码和最大,就需要让 $a$ 和 $b$ 的位数最大,那么 $x-1$ 就能保证 $a$ 与 $b$ 的位数与 $n$ 相同或者小一位。