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

告诉起亚医生如何计算两个整数的总和。但起亚是这么粗心,总是两位数字超过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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值