给你一个数n,显然n可以拆成两个数之和。比如5=1+4=2+3,100=20+80=1+99。
定义一个函数S,其中S(x)=x在十进制下各位数之和,比如S(6)=6,S(123)=1+2+3=6,S(100)=1+0+0=1。
现在要求使得a+b=n且S(a)+S(b)最大的一对元组(a,b)
贪心就好了,假设给你的n是10000,我们让a=9999,b=1就行,也就是说让a是全为9的且小于n的数就行。
比如n=123456,a=99999
n=100,a=99
n=10234234213,a=9999999999
为什么这样就可以呢?
S(a)+S(b)=S(a)+S(n-a),其实这个函数就由二元变成一元,只要确定a的值就行
随便找几个数试试就知道,一定要让a是999999.......999999这种形式,具体证明略过,给一个小小的tips,和n-a的减法竖式有关系,更具体的是和借位有关系。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
long long n;
long long ans;
long long bit;
long long a, b;
int main() {
scanf("%lld", &n);
if (n < 10) {
printf("%lld\n", n);
}
else {
long long tempn = n;
while (tempn > 0) {
tempn /= 10;
bit++;
}
long long bitfornine = bit - 1;
a = 9;
for (int i = 1;i <= bitfornine - 1;++i) {
a += ((long long)((long long)pow(10, i) * 9));
}
b = n - a;
while (b > 0) {
ans += (b % 10);
b /= 10;
}
ans += ((bit - 1) * 9);
printf("%lld\n", ans);
}
//system("pause");
return 0;
}