BNU4072:最大和

来源:互联网 发布:cst软件下载 编辑:程序博客网 时间:2024/06/07 16:12

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

Input

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

Output

一个数,为最优解。

Sample Input

5941

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

0 0
原创粉丝点击