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;

}

 

posted @ 2018-11-09 12:40  eason99  阅读(92)  评论(0编辑  收藏  举报