Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) B. Maximum Sum of Digits
阿新 • • 發佈:2018-11-09
題目大意就是給一個數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; }