题目大意:
将n拆为a和b,让a+b=n且S(a)+S(b)最大,求最大的S(a)+S(b)
题解:
一开始看到样例后以为是对半拆会是答案,结果WA了.
写了一发暴力看了一下,原来等于最大值的S(a)+S(b)的a和b组合不止一对(而出题人偏偏找出对半拆的那一堆,误导思路!!),且都和9有关,于是开始凑尽可能多的9。就是如果n的长度为n,那就让a凑n-1个9,然后第一位数我开始是把它设为1,即19999这样(因为我觉得设谁无所谓,设1的话b自然会减出来一个9,设2的话b自然会减出来一个8),结果又WA了!后来才发现这种想法是错误的,因为n不一定是整百整千的这样的,所以a为1,b不一定就会减出8这样子,所以最后从1到9循环枚举第一位是谁,然后取最大值终于过了......或者是,直接把第一位赋为9,先尽可能凑出更多的9
总结起来思路就是,让a凑尽可能多的9,b=n-a
再次佩服出题人出的样例,误导思路并且还不论哪种想法都能过样例
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define ll long long
#define INF 1000000007
int len(ll x)
{
int l=0;
while(x)
{
++l;
x/=10;
}
return l;
}
int cal(ll x)
{
int sum=0;
while(x)
{
sum+=x%10;
x/=10;
}
return sum;
}
int main()
{
//freopen("input.txt","r",stdin);
ll n;
cin>>n;
if(n<=18)
return cout<<n<<endl,0;
int l=len(n);
int ans=0;
for(int q=1; q<=9; ++q)
{
ll x=q;
for(int i=1; i<l; ++i)
x=x*10+9;
if(x>n)
x/=10;
ans=max(ans,cal(x)+cal(n-x));
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
#define ll long long
#define INF 1000000007
int len(ll x)
{
int l=0;
while(x)
{
++l;
x/=10;
}
return l;
}
int cal(ll x)
{
int sum=0;
while(x)
{
sum+=x%10;
x/=10;
}
return sum;
}
int main()
{
//freopen("input.txt","r",stdin);
ll n;
cin>>n;
if(n<=18)
return cout<<n<<endl,0;
int l=len(n);
int ans=0;
ll x=9;
for(int i=1; i<l; ++i)
x=x*10+9;
if(x>n)
x/=10;
ans=max(ans,cal(x)+cal(n-x));
cout<<ans<<endl;
return 0;
}