HDU 4726 Kia's Calculation热身赛2 1011题(贪心 每次都找最大位的放在前面)
159583036
Case #1: 8984
#include<iostream>#include<cstring>#include<string>#include<cmath>#include<cstdio>using namespace std;int a[10];int b[10];char t[1000005];char res[1000005];void debug() //真心的,debug了很久{ int i; for(i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; for(i=0;i<10;i++) cout<<b[i]<<" "; cout<<endl;}int main(){ int tes,i,len,j,k; scanf("%d",&tes); int cas=0; while(tes--) { for(i=0;i<10;i++) { a[i]=0,b[i]=0; } scanf("%s",t); len=strlen(t); for(i=0;i<len;i++) //统计第一串的0~9的个数 a[t[i]-'0']++; scanf("%s",t); for(i=0;i<len;i++) //统计第二串的0~9的个数 b[t[i]-'0']++; int tmp=-1; //这个地方真是个大坑,开始写的0 //debug(); int m,n; for(i=1;i<10;i++) //先找第一位,第一位不能是0,所以都是从1到9找的 { if(a[i]) { for(j=1;j<10;j++) { if(b[j]) { if((i+j)%10>tmp) { tmp=(i+j)%10; m=i,n=j; } } } } } res[0]='0'+tmp; //第一位找到 if(res[0]=='0') //如果第一位是0,说明后面也只能是0,直接输出0就可以了 { printf("Case #%d: 0\n",++cas); continue; } a[m]--,b[n]--; //两个串相应的数字个数减少一个 int p=1; while(1) { int m,n; tmp=-1; int cnt=0; for(i=0;i<10;i++) if(!a[i]) cnt++; if(cnt==10) break; for(i=0;i<10;i++) { if(a[i]) { for(j=9;j>=0;j--) { if(b[j]) { int tt=(i+j)%10; if(tt>tmp) { tmp=tt; m=i,n=j; } } } } } int tm=a[m]<b[n]?a[m]:b[n]; a[m]-=tm,b[n]-=tm; //每次找到之后直接让一个个数或者两个个数都变为0 for(k=p;k<p+tm;k++) res[k]='0'+tmp; p+=tm; } //debug(); res[p]='\0'; printf("Case #%d: %s\n",++cas,res); } return 0;}/*235958303612341241412412412421421412452342421231231321444678746758504556143364476573566354365553645675435364754364635433264630555555*/