传送门

思路:

  本题可用数位DP来做,设 f [ i ][ a ][ b ][ c ][ j ] 表示当前枚举到(二进制下的)第i位,a' b' c'各用a,b,c了几个1,j表示最后一位是否有进位。转移方程就只要暴力枚举8种情况(不同位置及是否进位)。

DP方程:

inline void dp()//动态规划,强行枚举八种情况
{
f[][][][][]=;
for (int i=;i<n;++i)
for (int j=;j<=jla;++j)
for (int k=;k<=jlb;++k)
for (int l=;l<=jlc;++l)
{
long long tmp=f[i][j][k][l][];//枚举最后一位不进位的情况
f[i+][j+][k+][l+][]=min(f[i+][j+][k+][l+][],tmp+(<<i+));
f[i+][j+][k][l+][]=min(f[i+][j+][k][l+][],tmp+(<<i));
f[i+][j][k+][l+][]=min(f[i+][j][k+][l+][],tmp+(<<i));
f[i+][j][k][l][]=min(f[i+][j][k][l][],tmp);
tmp=f[i][j][k][l][];//枚举最后一位进位的情况
f[i+][j+][k+][l+][]=min(f[i+][j+][k+][l+][],tmp+(<<i+));
f[i+][j][k+][l][]=min(f[i+][j][k+][l][],tmp+(<<i));
f[i+][j+][k][l][]=min(f[i+][j+][k][l][],tmp+(<<i));
f[i+][j][k][l][]=min(f[i+][j][k][l][],tmp);
}
}

  由上DP转移方程可看出,如果是枚举最后一位进位的情况,则需要转移到不进位的DP方程。因为二进制是逢二进一,最后一位如果为1,且进位,就要变为0;如果是从不进位开始转移,则与进位相反。

完整代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x7f7f7f7f7f7f7f
int T,a,b,c;
int n,jla,jlb,jlc;//n记录三个数的二进制数码长度的最大值,jla、jlb、jlc分别记录a、b、c的二进制数码中 1 的个数
long long f[][][][][];
inline int read()//快读
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
inline int lowbit(int x)//求出x的二进制数码中 1 的个数
{
int sum=;
for (;x;x>>=)
sum+=x&;
return sum;
}
inline void dp()//动态规划,强行枚举八种情况
{
f[][][][][]=;
for (int i=;i<n;++i)
for (int j=;j<=jla;++j)
for (int k=;k<=jlb;++k)
for (int l=;l<=jlc;++l)
{
long long tmp=f[i][j][k][l][];//枚举最后一位不进位的情况
f[i+][j+][k+][l+][]=min(f[i+][j+][k+][l+][],tmp+(<<i+));
f[i+][j+][k][l+][]=min(f[i+][j+][k][l+][],tmp+(<<i));
f[i+][j][k+][l+][]=min(f[i+][j][k+][l+][],tmp+(<<i));
f[i+][j][k][l][]=min(f[i+][j][k][l][],tmp);
tmp=f[i][j][k][l][];//枚举最后一位进位的情况
f[i+][j+][k+][l+][]=min(f[i+][j+][k+][l+][],tmp+(<<i+));
f[i+][j][k+][l][]=min(f[i+][j][k+][l][],tmp+(<<i));
f[i+][j+][k][l][]=min(f[i+][j+][k][l][],tmp+(<<i));
f[i+][j][k][l][]=min(f[i+][j][k][l][],tmp);
}
}
inline void clear()//为做DP初始化
{
memset(f,INF,sizeof(f));
n=max((int)log2(a)+,(int)log2(b)+);
n=max(n,(int)log2(c)+);//求 n
jla=lowbit(a),jlb=lowbit(b),jlc=lowbit(c);
}
int main()
{
a=read();b=read();c=read();
clear();
dp();
if(f[n][jla][jlb][jlc][]>=INF)//注意是“≥INF”
{
printf("-1\n");
return ;
}//如果无解就输出-1
printf("%lld\n",f[n][jla][jlb][jlc][]);//输出最小值
return ;
}

一些注意事项:

 ①本题的 f 数组要开long long 不然会爆。

 ②INF也要尽量开大。

 ②在判断无解时要判 " ≥ INF ”(因为转移过程中会加上部分的值)   

其他的一些细节瞎搞搞就AC了。

P4574 [CQOI2013]二进制A+B的更多相关文章

  1. BZOJ 3107 [cqoi2013]二进制a+b (DP)

    3107: [cqoi2013]二进制a+b Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 995  Solved: 444[Submit][Stat ...

  2. BZOJ3107 CQOI2013二进制A+B(动态规划)

    显然答案只与a.b.c中各自1的个数及位数有关.a.b只考虑前i位怎么填时,c最多在第i+1位上为1,而第i+1位及之后的a.b怎么填都不会对前i位造成影响.于是设f[n][i][j][k][0/1] ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. 使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...

  5. 如何开启MySQL 5.7.12 的二进制日志

    1. 打开/etc下的my.cnf文件 2. 编辑它,添加内容: log_bin=binary-log   #二进制日志的文件名 server_id=1  #必须指定server_id,这是MySQL ...

  6. 【.net 深呼吸】使用二进制格式来压缩XML文档

    在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...

  7. Javascript的二进制数据处理学习 ——nodejs环境和浏览器环境分别分析

    以前用JavaScript主要是处理常规的数字.字符串.数组对象等数据,基本没有试过用JavaScript处理二进制数据块,最近的项目中涉及到这方面的东西,就花一段时间学了下这方面的API,在此总结一 ...

  8. 浅析MySQL基于ROW格式的二进制日志

    上文分析的二进制日志实际上是基于STATEMENT格式的,下面我们来看看基于ROW格式的二进制日志,毕竟,两者对应的binlog事件类型也不一样,同时,很多童鞋反映基于ROW格式的二进制日志无法查到原 ...

  9. 浅析MySQL二进制日志

    查看MySQL二进制文件中的内容有两种方式 1.  mysqlbinlog 2.  SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offs ...

随机推荐

  1. <转>jmeter(三)SOAP/XML-RPC Request

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  2. Python+OpenCV图像处理(十)—— 图像二值化

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 一.普通图像二值化 代码如下: import cv2 as cv import numpy ...

  3. 搭建ELK日志分析(亲测无毒!)截图没有附上。。凑合看。搭建出来没有问题

    ( 1 )安装 Logstash 依赖包 JDK Logstash 的运行依赖于 Java 运行环境, Logstash 1.5 以上版本不低于 java 7 推荐使用最新版本的 Java .由于我们 ...

  4. Django之MVC和MTV

    一. MVC MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心(比如数据库记录列表). ...

  5. sql server还原注意事项

    使用Sql Server 2000的数据库备份文件还原Sql Server 2000的数据库和还原Sql Server 2005的数据库区别:1.在还原至Sql 2000时是必须新建数据库并对其还原, ...

  6. 判断闰年C语言版

    #include<stdio.h> int isLeap(int year) { // 必须先判断是平年的情况 后判断闰年的情况 == && year%!=) || yea ...

  7. Prometheus监控学习笔记之Prometheus普罗米修斯监控入门

    0x00 概述 视频讲解通过链接网易云课堂·IT技术快速入门学院进入,更多关于Prometheus的文章. Prometheus是最近几年开始流行的一个新兴监控告警工具,特别是kubernetes的流 ...

  8. Maven 工程读取resource下的文件

    1:方式1: public static List<String> userList; static { userList = new LinkedList<String>() ...

  9. rocketmq安装与基本操作

    如果不是因为政治原因,就rocketmq的社区活跃度.版本.特性和文档完善度,我是无论如何也不会使用rocketmq的. rocketmq严格意义上并不支持高可靠性,因为其持久化只支持异步,有另外一个 ...

  10. 【题解】Luogu P1533 可怜的狗狗

    原题传送门 莫队介绍,Splay介绍 离线的题目,莫队是不错的解决方法 先把询问排一下序 剩下就套一个莫队的板子 每来一只狗就把漂亮值插入平衡树 每去掉一只狗就把漂亮值从平衡树中删掉 每次查询查平衡树 ...