Codeforces 1060B Maximum Sum of Digits

本文探讨了给定整数n时,寻找两数a和b,使得a+b=n且S(a)+S(b)最大,其中S(x)表示x的各位数字之和。通过将a设为尽可能接近n的全9数,实现S(a)+S(b)的最大化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个数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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值