天天看点

codeforces-1060B Maximum Sum of Digits-题解

题目:

任意给一个数 n ,把他分解为 n = a + b ,求 a 与 b 中的每一位数相加之和的最大值。

思路:

一:找出S的位数ant,A加上ant-1位9;eg:30000开始是9999

二:A的第一位为S第一位数字-1

此时A就变成了29999

三:算出B=S-A,拆位,输出ans

(此时ans=1)

#include<cstdio>
#include<iostream>
using namespace std;
long long a=0,b,c,s,pow[20];
int ask(long long a)
{
    int cnt=0;
    while(a)
    {
        cnt=cnt+a%10;
        a/=10;
        }
    cnt=cnt+a;
    return cnt;
}
int main()
{
	pow[0]=1;
	for(int i=1;i<20;i++)
		pow[i]=10*pow[i-1];
	cin>>s;//s=30000
	c=s;//c=30000
	int ant=0;
	while(s/10){
        a=a*10+9;//9,99,999,9999,算出最高位后的数字 eg:9999 
        s/=10;//3000,300,30,3
        ant++;//1,2,3,4
    }
	a=a+(s-1)*pow[ant];//算出最高位上的数字 eg:2 
    b=c-a;
	cout<<ask(a)+ask(b)<<endl;
	return 0; 
} 
           

S(a)+S(b)是如何变大的?考虑b任意一个数位,当其从0变为9,S(a)增大1,S(B)增大8;当是其它情况时(数位变化不跨越0),相当于S(a)+x, S(b)-x,S(a)+S(b)不变。总结起来,划分(a,b)时让尽量多的数位变化能够跨越0,等于让b的每一位尽量分最多出来。得到贪心策略,每一数位都分9出来。

继续阅读