2013 ACM/ICPC Asia Regional Online —— Warmup2
贪心
给出两个位数一样的数,位数<=10^6;
数字的每一位都能移动, 但移动后的整数一定要是合法的, 即无前导零。 使得 A + B 最大
特殊加法: 8+2=0; 8+3=1;
贪心从9开始取,第一位不能为0;
#include "stdio.h"
#include "string.h"
char stra[1000100],strb[1000100];
int Min(int a,int b)
{
if (a<b) return a;else return b;
}
int main()
{
int Case,i,j,key,k,num,ii;
int a[11],b[11];
scanf("%d",&Case);
for (ii=1;ii<=Case;ii++)
{
scanf("%s%s",stra,strb);
printf("Case #%d: ",ii);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for (i=0;stra[i];i++)
a[stra[i]-'0']++;
for (i=0;strb[i];i++)
b[strb[i]-'0']++;
key=0;
for (i=9;i>=1;i--)
{
for (j=1;j<=9;j++)
{
k=(i-j+10)%10;
if (k==0) continue;
if (a[j]==0 || b[k]==0) continue;
a[j]--;
b[k]--;
key=1;
printf("%d",i);
break;
}
if (key==1) break;
}
if (key==0)
{
printf("0\n");
continue;
}
for (i=9;i>=0;i--)
{
for (j=0;j<=9;j++)
{
k=(i-j+10)%10;
if (a[j]==0 || b[k]==0) continue;
num=Min(a[j],b[k]);
a[j]-=num;
b[k]-=num;
while (num) {printf("%d",i);num--;}
}
}
printf("\n");
}
return 0;
}