BNU4072:最大和

给你一串数,再给你几个加号插入这串数中,求使和最大的方案。 如给你594,再给你一个加号,易得最优方案为5+94=99。

Input

第一行为这一串长数,长度l<=400。 第二行为一个整数k,代表加号的个数,k<=400。

Output

一个数,为最优解。

Sample Input

594
1

Sample Output

99
 
唉,寒假荒废了一个多月,实在惭愧啊,虽说家里没有电脑,但是这些都只是借口,话不多说,赶快老老实实A题吧
这道题看上去似乎有点复杂,其实相同了很简单
无论多长的数,多少个加号,那么我们只需要找到加号用完的前提下,能得到的最长的数即可,因为每增加一位,其数量级也是几何增长的
例如594,在添加一个加号的情况下,能得到的一个最长的数是2位
那么在594中找到最大的2位数,其他全部按个位数即可
又比如653421,在添加3个加号的情况下能得到的最长位数是3位
而里面最大的三位数是653,然后653+4+2+1=660
也就是说,在长len,添加k个加号的情况下,我们只需要找到长度为len-k的最大数,再加上其他每位数就是答案了
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    char num[500],maxn[500],tem[500];
    int len,k,i,j,pos,ans[500],l,t;
    while(~scanf("%s%d",num,&k))
    {
        memset(maxn,0,sizeof(maxn));
        memset(tem,0,sizeof(tem));
        memset(ans,0,sizeof(ans));
        len = strlen(num);
        for(i = 0; i<=k; i++)//找len-k长度下的最大数
        {
            for(j = 0; j<len-k; j++)
                tem[j] = num[j+i];
            if(strcmp(tem,maxn)>0)
            {
                memset(maxn,0,sizeof(maxn));
                strcpy(maxn,tem);
                pos=i;
            }
        }
        l = 0;
        t = 0;
        for(i = 0; i<pos; i++)
            t+=num[i]-'0';
        for(i = pos+len-k; i<len; i++)
            t+=num[i]-'0';
        for(i = pos+len-k-1; i>=pos; i--)//由于是大数,要存入数组,通过取模实现
        {
            ans[l++]=(t+num[i]-'0')%10;
            t = (t+num[i]-'0')/10;
        }
        while(t)
        {
            ans[l++] = t%10;
            t/=10;
        }
        l--;
        while(!ans[l] && l) l--;
        for(i = l; i>=0; i--)
            printf("%d",ans[i]);
        printf("\n");
    }


    return 0;
}

你可能感兴趣的:(BNU)