HDU4726——Kia's Calculation——2013 ACM/ICPC Asia Regional Online —— Warmup2
题目的意思是给你两个数字(多达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的更多相关文章
- 2013 ACM/ICPC Asia Regional Online —— Warmup2 ABEGKL
HDU4716 A. A Computer Graphics Problem A题目描述 题意:输出手机剩余电量,保证给出的数是10的倍数. 题解:水题,按题意输出即可. 代码: #include & ...
- 2013 ACM/ICPC Asia Regional Online —— Warmup2
HDU 4716 A Computer Graphics Problem 水题.略 HDU 4717 The Moving Points 题目:给出n个点的起始位置以及速度矢量,问任意一个时刻使得最远 ...
- HDU4722——Good Numbers——2013 ACM/ICPC Asia Regional Online —— Warmup2
今天比赛做得一个数位dp. 首先声明这个题目在数位dp中间绝对是赤裸裸的水题.毫无技巧可言. 题目的意思是个你a和b,要求出在a和b中间有多少个数满足数位上各个数字的和为10的倍数. 显然定义一个二维 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- 用docsify快速构建文档,并用GitHub Pages展示
什么是docsify 无需构建,写完 markdown 直接发布成文档,写说明文档的极佳选择. 快速上手 安装 npm i docsify-cli -g docsify init docs 创建项目 ...
- C++构造函数和析构函数什么情况下会用
析构函数: 1. 对象生命周期结束,被销毁时: 2. delete 指向对象的指针时: 3. delete 指向基类对象的指针时,其析构函数是虚函数: 4. 在嵌套关系中,对象A是对象B的成员,当对象 ...
- tomcat启动项目的时候不报错而且启动的很快
最后发现是tomcat部署项目的时候,并没有将一部分文件复制到tomcat的目录下 方法 将没有添加的目录 Finish
- mysql innodb 从 ibd 文件恢复表数据
最近内部的 mysql 数据库发生了一件奇怪的事,其中有一个表 users625 突然出现问题, 所有对它的操作都报错误 数据表不存在. mysql> select count(*) from ...
- Visual Studio Code搭建NodeJs的开发环境
一.Visual Studio Code搭建NodeJs的开发环境 1.下载安装NodeJs并配置环境变量 可以参考:NodeJs的安装和环境变量配置 2.下载安装 VS Code编辑器 可以参考:V ...
- Docker部署Golang
1. 安装docker 2. mkdir myDocker 3. cd myDocker && touch Dockerfile 4. Dockerfile写入 # 将golang ...
- Vue 列表渲染及条件渲染实战
条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue 帮我们提供了一个v-if的指 ...
- C++:类中两个易被忽略的默认函数
C++的自定义类中有六个默认的函数,即如果用户没有显式定义这些函数时,C++编译器会类中生成这些函数的默认形式.除了大家所熟知的构造函数.拷贝构造函数.赋值函数和析构函数外,C++为自定义类 还提供了 ...
- Gogoing 场景调研(补)
一.典型用户 蜗居在学校的大学生 二.场景描述 编号 用户故事 故事价值 (点数) 1 作为一名大学生,只知道学习 2 经常打游戏而无所事事的大学生 1.背景 (1)典型用户:张晨建 (2)用户的需求 ...
- PHPCMS之 列表和内容页
上一篇随笔中降到了一些相似的语法可以来后台管理网页的内容,下面就是关于列表的管理 加入一级栏目中有几个有二级菜单的,那么就可以把相应的界面建立一个副本,然后修改里面栏目的一些属性 {pc:conten ...