CodeForces - 1060B Maximum Sum of Digits (思维)

题目大意:

       将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
#include
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)
            x/=10;
        ans=max(ans,cal(x)+cal(n-x));
    }
    cout<
#include
#include
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)
        x/=10;
    ans=max(ans,cal(x)+cal(n-x));
    cout<

 

你可能感兴趣的:(ACM,codeforces,思维)