题目的意思是给你两个数字(多达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. Python面向过程、模块的使用

    一.Python面向过程 ''' 面向过程编程 核心过程二字,过程指的是解决问题的步骤,即先干什么.再干什么.然后干什么... 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式 优点 ...

  2. Python中的dict字典的用法

    Python中的字典特点: 速度快,内部使用二分查找的方式 可以用来存储大量的关系型数据 字典是无序的 字典的定义方式: dic = dict(name =”zhangsan”,  age = 19) ...

  3. FileCopy方法

    复制文件. 语法 FileCopy源,目标 FileCopy 语句语法包含以下命名参数: 部分 说明 source 必需. 指定要复制的文件的名称的字符串表达式. _源_可能包含目录或文件夹,和驱动器 ...

  4. python接口自动化2-发送post请求

    发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实不用去 ...

  5. python描述符详解

    1描述符: 描述符是指将某种特殊类型的类的实例支配给另外一个类的属性. 对于特殊类型必须实现以下三个方法中至少一个方法:    def __get__(self,instance,owner): -用 ...

  6. python里的魔法方法1(构造与析构)

    魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...

  7. ThreadPoolExecutor 使用说明

    它是一个ExecutorService,使用线程池中的线程执行提交的任务.通常我们使用Executors框架,定义使用. 线程池主要用来解决两类问题:通过缓存一定数量的可用线程,避免频繁的线程创建,销 ...

  8. oracle 数据库的详细安装教程

    由于oracle数据库比较大 所以安装的时候比较慢是目前装的最大的软件了吧 而且如果装崩了 可能还会重装系统 不过比较幸运 一次就装好 1.需要去官网下载  https://www.oracle.co ...

  9. Python-opencv摄像头图像捕获

    实例一 (灰色调度) #!/usr/bin/env python # _*_ coding:utf-8 _*_ import cv2 as cv import numpy as np capture ...

  10. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...