给你一串数,再给你几个加号插入这串数中,求使和最大的方案。 如给你594,再给你一个加号,易得最优方案为5+94=99。
第一行为这一串长数,长度l<=400。 第二行为一个整数k,代表加号的个数,k<=400。
一个数,为最优解。
594 1
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; }