题目的意思是给你两个数字(多达10^6位)

做加法,但是有一点,没有进位(进位不算,相当于这一位相加后对10取模)

你可以任意排列两个数字中的每一位,但是不能是0开头。

现在题目要求以这种不进位的算法计算得到的最大值是多少?

看完题目就会知道,这个题目一定不是dp,或者说根本不是什么高端的算法,那是什么呢?

对,你没有猜错——贪心。

为什么可以用贪心呢?我们比较一个数,都是从高位的先比较,所以只要高位的大,这个数就大;于是我们要得到最大的和,就要先统计能够构成多少个9,多少个8……(有大的就先构成大的!)。

但是考虑到首位不能是0这个特殊条件,我们需要对首位进行精心的选择。怎么选?首先看能够用两位废0数构成9,如果不行,那就构成8,7……

知道找到能够用两个非0数构成的最大数为止,这个数就是最前的(最高位)。

最最容易错的一点就是你怎么得到你构成的取法是最优的呢?

我们除了要得到一个最大的首位以外,还要考虑我们得到了这个数字后会影响我们获得其他的数字吗?

所以我们除了要得到一个最大的首位以外,还要保证这个首位相同的情况下,对构成其他的数字的影响最小(我个人的想法,应该是对的,觉得有为题的可以加我QQ:121462136仔细探讨一下)。

后面的就是赤裸裸的贪心了。

我的代码:(A了是A了,我觉得也可能是题目的数据有点弱呢,我觉得我这个方法也不是很对的赶脚,诶,不好说,欢迎联系我指出错误)

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1000100
using namespace std; char s[maxn];
int
a[][],t,lead,tep,num[],tot,cas=; int count1(int A)//考虑第一个数字取A,影响能构成的一个数字并返回
{

for
(int i=; i>; i--)
{

int
B=(+i-A)%;
if
(a[][A] && a[][B]) return i;
}

return
;
}
int count2(int B)//与上同理,只是第二组取B
{

for
(int i=; i>; i--)
{

int
A=(+i-B)%;
if
(a[][A]&& a[][B]) return i;
}

return
;
}
void getlead()//找首位数字
{

int
affect=,A=;
for
(int a1=; a1<=; a1++)
{

int
a2=(+-a1)%;
if
(a1*a2 && a[][a1] && a[][a2])
{

lead=;
a[][a1]--,a[][a2]--;
return
;
}
}//如果是9,不用考虑对别的影响(想想为什么?)

for
(lead=; lead>; lead--)
{

for
(int a1=; a1<=; a1++)
{

int
a2=(+lead-a1)%;
if
(a1*a2 && a[][a1] && a[][a2])
{

if
(max(count1(a1),count2(a2))<affect) affect=max(count1(a1),count2(a2)),A=a1;//取影响的数字最小的。
}
}

if
(A>)//找到非0的首位了,上下都要减去一个作为更新
{

a[][A]--;
a[][(+lead-A)%]--;
return
;
}
}
}
int main()
{

scanf("%d",&t);
while
(t--)
{

lead=;
memset(a,,sizeof a);
memset(num,,sizeof num);
scanf("%s",s); tot=strlen(s);
for
(int i=; s[i]; i++) a[][s[i]-'0']++;
scanf("%s",s);
for
(int i=; s[i]; i++) a[][s[i]-'0']++;
getlead();
for
(int i=; i>; i--)//枚举假设构成的数字为i,从大到小嘛,先构成大的。
{

for
(int a1=; a1<=; a1++)
{

int
a2=(+i-a1)%;
tep=min(a[][a1],a[][a2]);
a[][a1]-=tep,a[][a2]-=tep;
num[i]+=tep;
}
}

printf("Case #%d: ",++cas);
if
(lead==)//首位为0的话就说明答案为0
{

printf("0\n");
}

else//否则说明答案一定有n位(想想为什么?)

{

printf("%d",lead);
tot--;
for
(int i=; i>; i--)
{

for
(int j=; j<=num[i]; j++) printf("%d",i);
tot-=num[i];
}

for
(int i=; i<=tot; i++) printf("0");
printf("\n");
}
}

return
;
}

HDU4726——Kia's Calculation——2013 ACM/ICPC Asia Regional Online —— Warmup2的更多相关文章

  1. 2013 ACM/ICPC Asia Regional Online —— Warmup2 ABEGKL

    HDU4716 A. A Computer Graphics Problem A题目描述 题意:输出手机剩余电量,保证给出的数是10的倍数. 题解:水题,按题意输出即可. 代码: #include & ...

  2. 2013 ACM/ICPC Asia Regional Online —— Warmup2

    HDU 4716 A Computer Graphics Problem 水题.略 HDU 4717 The Moving Points 题目:给出n个点的起始位置以及速度矢量,问任意一个时刻使得最远 ...

  3. HDU4722——Good Numbers——2013 ACM/ICPC Asia Regional Online —— Warmup2

    今天比赛做得一个数位dp. 首先声明这个题目在数位dp中间绝对是赤裸裸的水题.毫无技巧可言. 题目的意思是个你a和b,要求出在a和b中间有多少个数满足数位上各个数字的和为10的倍数. 显然定义一个二维 ...

  4. HDU 4717 The Moving Points(三分法)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description There are N points in total. Every point moves in certain direction and certain speed. W ...

  5. HDU 4719 Oh My Holy FFF(DP+线段树)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description N soldiers from the famous "*FFF* army" is standing in a line, from left to ri ...

  6. HDU 4722 Good Numbers(位数DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description If we sum up every digit of a number and the result can be exactly divided by 10, we say ...

  7. HDU 4725 The Shortest Path in Nya Graph(最短路径)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...

  8. hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...

  9. hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. CentOS 下 SonarQube 6.7 的下载、配置、问题排查

    CentOS 下 SonarQube 6.7 的下载.配置.问题排查 系统: CentOS 7 x86_64 SonarQube 版本: 6.7.3 Java 版本: 1.8.0_171 MySQL ...

  2. java查询几个菜单下的所有下级菜单

    需求: 假如有几个一级菜单,一级菜单下面有几个二级菜单,二级菜单下又还有三级菜单.现在要求一级菜单里面的几个设置为无效,将不显示在前端.现在需要的是查询出一级菜单下面所有的菜单,包括二级,三级菜单 原 ...

  3. [算法总结] 20 道题搞定 BAT 面试——二叉树

    本文首发于我的个人博客:尾尾部落 0. 几个概念 完全二叉树:若二叉树的高度是h,除第h层之外,其他(1~h-1)层的节点数都达到了最大个数,并且第h层的节点都连续的集中在最左边.想到点什么没?实际上 ...

  4. 点斜杠 & 如何查看linux程序安装位置 dpkg -L yyy

    方法1: sudo find / -name ssh 方法2: Ubuntu下 看应用程序安装路径的方法 ubuntu下dpkg -L xxx看应用程序安装路径 1.点斜杠 “./”就代表在当前目录下 ...

  5. poweroff命令详解

    2019-02-17  基础命令学习目录首页   原文链接:https://www.cnblogs.com/Baron-Lu/p/6951297.html 在本篇中,我们会向你解释 shutdown. ...

  6. "prefs:root" or "App-Prefs:root"

    iOS 苹果审核也是看心情的吗?已经上线几个版本了,新版本提交审核居然被查出来了! Guideline 2.5.1 - Performance - Software Requirements Your ...

  7. Visual Studio win平台 AI环境搭建

    内容提要:我觉得难点主要出在下载上,程序跑的都挺流畅的.下载有时会失败. 1.下载安装git.这一步主要为了下载示例和自动安装环境的python代码,直接去github上用网页下载也是一样的,git不 ...

  8. Scrum Meeting 10.27

    1.会议内容: 姓名 今日任务 明日任务 预估时间(h) 徐越 配置SQLserver 学习本地和服务器之间的通信 4 卞忠昊 找上届代码的bug 学习安卓布局(layout)的有关知识,研究上届学长 ...

  9. MathExam小学一二年级计算题生成器V1.0

    MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...

  10. 20135234mqy-——信息安全系统设计基础第七周学习总结

    第六章 存储器层次结构 存储器系统是一个具有不同容量,成本和访问时间的存储设备的层次结构. CPU寄存器保存着最常用的数据. 靠近CPU的小的,快速的高速缓存存储器作为一部分存储在相对较慢的主存储器( ...