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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxxjxw/article/details/82949904

题目大意:

       将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;
}

猜你喜欢

转载自blog.csdn.net/hxxjxw/article/details/82949904