Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) B. Maximum Sum of Digits
题目大意就是给一个数c,然后拆成a和b,使得a+b=c,要求使得a的各数位之和+b的各数位之和达到最大。
我的想法就是可能不能单独考虑a的数位之和或b的数位之和,要综合考虑才能达到最优,先来看ci,ci=ai+b+flag的,这里的flag是前一位(较低位)的进位,存在是0,否则是1,若是ci-flag!=9的时候,ai+bi有2个取值,一种是ai+bi=ci-flag,另外一种是ai+bi=ci-flag+10,明显ai+bi取第二种时对答案的贡献最大,但是第二种的话,会让第i+1位对答案的贡献少1(因为进位了),但是却让第i位对答案的贡献多了10,综合看对答案的贡献净增加了9,所以总的来说第二种做法还是最优的,若是ci-flag=9的时候,ai+bi就不可以等于ci-flag+10了,因为不存在2个个位数相加超过18的,那么就只能取第一种做法了,即ai+bi=ci-flag,那么对答案的贡献就是ci-flag.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll ans=0;
int flag=0;
char s[15];
scanf("%s",s);
int len=strlen(s);
if(len==1)
{
printf("%d\n",s[0]-'0');
return 0;
}
for(int i=len-1;i>=0;i--)
{
int tmp=s[i]-'0'-flag;
if(tmp!=9)
{
if(i==0)
ans+=tmp;
else
ans+=tmp+10;
flag=1;
}
else
{
ans+=9;
}
}
cout<<ans<<endl;
return 0;
}