HDU 4726 Kia's Calculation

来源:互联网 发布:redis实战java 编辑:程序博客网 时间:2024/04/28 13:44

题意:

给你两个数A、B,它们的位数一样,现在可以任意移动A、B数中数字的位置,0不能做为首部,并定义不进位的加法,即两个单位数相加结果为单位数%10,问你相加之后能得到的最大值是多少。

思路:

这里位数有10^6位(一开始看错看成数字的大小<=10^6,还以为只有6位),分别统计A、B每个数字出现的次数,然后先处理首位,直接枚举可能出现的情况然后取最大值,对于其他位,枚举可能的结果,即从9到0,对于每种结果去计算其可能出现的个数,然后放置在答案数组中。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAX=1000005;int T;char A[MAX],B[MAX];int cnta[15],cntb[15],ans[MAX];int main(){int cas=1;scanf("%d",&T);while(T--){scanf("%s%s",A,B);memset(cnta,0,sizeof(cnta));memset(cntb,0,sizeof(cntb));int num=strlen(A);memset(cnta,0,sizeof(cnta));memset(cntb,0,sizeof(cntb));for(int i=0;i<num;i++){cnta[A[i]-'0']++;}for(int i=0;i<num;i++){cntb[B[i]-'0']++;}printf("Case #%d: ",cas++);if(num==1){printf("%d\n",(A[0]-'0'+B[0]-'0')%10);continue;}//firstint Max=-1,indexi,indexj,tmp;for(int i=1;i<=9;i++){if(!cnta[i]) continue;for(int j=1;j<=9;j++){if(!cntb[j]) continue;tmp=(i+j)%10;if(Max<=tmp){Max=tmp;indexi=i;indexj=j;}}}cnta[indexi]--;cntb[indexj]--;ans[1]=Max;//otherint top=2;for(int i=9;i>=0;i--){for(int j=0;j<=9;j++){int k=(i-j+10)%10;if(cnta[j]==0||cntb[k]==0) continue;int cnt=min(cnta[j],cntb[k]);cnta[j]-=cnt;cntb[k]-=cnt;while(cnt--){ans[top++]=i;}}}//delletint st=1;for(int i=1;i<num;i++){if(ans[i]==0) st++;else break;}//printfor(int i=st;i<=num;i++){printf("%d",ans[i]);}printf("\n");}return 0;}


0 0