Codeforces 1060B Maximum Sum of Digits

给你一个数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 
#include 
#include 
#include 
#include 
#include 

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;
}

 

你可能感兴趣的:(ACM)