1. 程式人生 > >Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) B. Maximum Sum of Digits

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;

}