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;
}
现在起亚有两个整数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;
}
相关文章推荐
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- HDU - 4726 Kia's Calculation (贪心 数字加和错误运算处理)
- js中多个数字运算后值不对(失真)处理方法
- Win8Metro(C#)数字图像处理--2.27图像加法运算
- 【HDU】5747 - Aaronson(位运算 & 贪心)
- 【数字图像处理】图像二值化,腐蚀膨胀,开闭运算,击中击不中变换
- javascript 错误“缺少十六进制数字”的处理
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
- HDU - 5014 Number Sequence(贪心+位运算)
- 数字图像处理:10.形态学运算
- HDU 1735 统计数字(贪心)
- Win8Metro(C#)数字图像处理--2.28图像乘法运算
- 字符串内特殊字符在html_javascript_xml等内使用时的转换 ,"缺少十六进制数字"错误的处理
- 数字图像处理3---图像基本运算--续
- 历届试题 错误票据(字符串处理,根据空格区分字符串种的数字)