P4574 [CQOI2013]二进制A+B
传送门
思路:
本题可用数位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的更多相关文章
- BZOJ 3107 [cqoi2013]二进制a+b (DP)
3107: [cqoi2013]二进制a+b Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 995 Solved: 444[Submit][Stat ...
- 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] ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- 如何开启MySQL 5.7.12 的二进制日志
1. 打开/etc下的my.cnf文件 2. 编辑它,添加内容: log_bin=binary-log #二进制日志的文件名 server_id=1 #必须指定server_id,这是MySQL ...
- 【.net 深呼吸】使用二进制格式来压缩XML文档
在相当多的情况下,咱们写入XML文件默认是使用文本格式来写入的,如果XML内容是通过网络传输,或者希望节省空间,特别是对于XML文档较大的情况,是得考虑尽可能地压缩XML文件的大小. XmlDicti ...
- Javascript的二进制数据处理学习 ——nodejs环境和浏览器环境分别分析
以前用JavaScript主要是处理常规的数字.字符串.数组对象等数据,基本没有试过用JavaScript处理二进制数据块,最近的项目中涉及到这方面的东西,就花一段时间学了下这方面的API,在此总结一 ...
- 浅析MySQL基于ROW格式的二进制日志
上文分析的二进制日志实际上是基于STATEMENT格式的,下面我们来看看基于ROW格式的二进制日志,毕竟,两者对应的binlog事件类型也不一样,同时,很多童鞋反映基于ROW格式的二进制日志无法查到原 ...
- 浅析MySQL二进制日志
查看MySQL二进制文件中的内容有两种方式 1. mysqlbinlog 2. SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offs ...
随机推荐
- 了解一下 Linux 上用于的 SSH 图形界面工具
如果你碰巧喜欢好的图形界面工具,你肯定很乐于了解一些 Linux 上优秀的 SSH 图形界面工具.让我们来看看这三个工具,看看它们中的一个(或多个)是否完全符合你的需求. 在你担任 Linux 管理员 ...
- QQ项目
QQ第一部分: 1.数据库 每一个QQ账户必须有 a. state:是否上线的状态 b. IP:正在上线的主机的IP c. port:UDP端口号(用这个和别的好友通讯) 注:TCP连接时,在 ...
- MySQL按指定字段自定义列表排序
亲测实例: 1级排序:同城>异城 2级排序:未领养>以领养 3级排序:发布最新靠前 MYSQL语句如下: SELECT ura.id,ura.city,ura.uid,ura.rescue ...
- 注册登录二合一之bootstrap
来源 https://bootsnipp.com/snippets/featured/login-and-register-tabbed-form jquery插件 需导入bootstrap插件 这个 ...
- UUID实现之一twitter的分布式自增IDsnowflake算法
Twitter的分布式自增ID算法snowflake (Java版) 概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点 ...
- 关于PRD、MRD、BRD文档
笔者现在所在的公司有专职的产品经理,在职业生涯最长的那家公司,并没有专门的产品经理,虽然在创业公司期间有产品经理,但是似乎产品经理更多的是和客户沟通需求,反馈,并不输出正规意义上产品经理该有的输出.从 ...
- 一致性哈希算法(适用于分库分表、RPC负载均衡)转
在分布式应用中,应该来说使用到hash最多的地方就是rpc负载均衡和分库分表,通常对于正式意义上的分布式应用来说,扩容和收缩是一个半自动化的过程,在此期间,应用基本上是可用的,所以不能发生大规模动荡的 ...
- Vue 中的动画特效
Vue 中的动画特效 CSS 实现标签显隐 <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- OSI7层模型(TCP4层)
OSI7层模型(TCP4层) 第一层:物理层 在局部局域网络上传送帧,它负责管理电脑通信设备和网络媒体之间的互通.包括了针脚.电压.线缆规范.集线器.中继器.网卡.主机适配器等. 第二层:数据链路层 ...
- oracle基础——内存管理、优化
内存图解: 自动管理:11g:AMM 10g:ASMM SGA(system global area):由所有服务进程和后台进程共享 PGA(program global area): 由每个服务 ...