您的位置:首页 > 其它

HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)

2017-12-16 17:19 316 查看
告诉起亚医生如何计算两个整数的总和。但起亚是这么粗心,总是两位数字超过9时忘记携带一个数字。例如,当她计算4567 + 5789时,她将得到9246,而1234 + 9876,她将得到0.酥油生气关于这个,为她解决了一个难题:

现在起亚有两个整数A和B,她可以按照自己喜欢的顺序对每个数字中的数字进行混洗,但是不允许前导零。也就是说,对于A = 11024,她可以将数字重新排列为10124或41102,或者其他很多,但不允许有02411。

在她洗牌之后,她将以自己的方式加在一起。 A“+”B的最大可能和是多少?

输入

第一行有一个数字T(T <= 25),表示测试用例的数量。

每个测试用例都有两行。第一行有数字A,第二行有数字B.

A和B都具有相同的数字位数,不大于10 6,并且没有前导零。

输出

对于测试用例X,首先输出“Case #X:”,然后输出最大可能的总和而不用前导零。

示例输入

1

5958

3036

示例输出
案例#1:8984

思路:贪心 

1.先排第一位数字,因为有先导0的存在,处理第一位的时候不考虑0

2.考虑特殊情况55+55=0等特殊数据的处理

3.计算数字的时候从是否满足9到0来计算

#include <algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;

char str1[2000002],str2[2000002];
int a[20],b[20];
int ans[2000002];
int main()
{
int t,icase=0;
scanf("%d",&t);
while(t--)
{
icase++;
scanf("%s%s",str1,str2);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int num=strlen(str1);
for(int c=0; c<num; c++) //转换数字完毕
{
a[str1[c]-'0']++;
b[str2[c]-'0']++;
}

if(num==1) //讨论只有一位数的情况
{
printf("Case #%d: %d\n",icase,(str1[0]-'0'+str2[0]-'0')%10);
continue;
}

int imax=0,i=0,x,y;
//因为先导0的存在 特别的算出第一位数字
for(int itemp=1; itemp<= 9; itemp++)
for(int ipos=1; ipos<=9; ipos++)
if(a[itemp]&&b[ipos]&&((itemp+ipos)%10>=imax))
{
imax=(itemp+ipos)%10;
x=itemp;
y=ipos;
}
a[x]--;
b[y]--;
ans[i++]=imax;

for(int sum=9; sum>=0; sum--) //数字从9到0循环
for(int itemp=0; itemp<=9; itemp++)
{
if(a[itemp])
{
//讨论两数相加<10
int ipos;
if(itemp<=sum)
ipos=sum-itemp;
//讨论两数相加>10
else
{
ipos=10+sum-itemp;
if(ipos>9) continue;
}
if(b[ipos])
{
int k=min(a[itemp],b[ipos]);
a[itemp]-=k;
b[ipos]-=k;
while(k--)
ans[i++]=sum;
}
}
}
printf("Case #%d: ",icase);
int cnt=0;
while((ans[cnt]==0)&&(cnt<num-1)) //特殊情况 55 55
cnt++;
for(int i=cnt; i<num; i++)
printf("%d",ans[i]);
printf("\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 贪心