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 ...
随机推荐
- 2、在VM上的 CentOS 6.5 上安装mysql
1.查看系统是否安装了MySQL 使用命令: #rpm -qa | grep mysql 2.卸载已安装的MySQL 卸载mysql命令如下: #rpm -e - ...
- Elasticsearch集群内的原理
一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力.当有节点加入集群中或者从 ...
- 2017_CET4_CET6_正规段子——正规!正规!解析!段子手勿入!
噫,2017年的四六级结束了,布吉岛宝宝们考得肿么样,反正本宝宝六级听力刚开始一阵挠头…… 天,神一般的FM信号,吃吃吃,擦擦擦,吃擦吃擦,吱吱吱…… 考完了就真完了,走出考场的那一刻,突然想起灰太狼 ...
- ltp-ddt的makefile结构
顶层makefile COMMON_TARGETS := pan utils COMMON_TARGETS += tools testcases/ddt COMMON_TARGET ...
- linux下nginx整合php
在nginx中药使用php可不像apache那样,因为apache是把php当做自己的一个模块来启动的, 而我们的nginx是把http请求转发给php程序,也就是说,php和nginx是相互独立的的 ...
- selenium得到弹出窗口
# 获取当前的页面窗口 first_handle = brower.current_window_handle handles = brower.window_handles for i in han ...
- Linux的常用路由配置
1.配置默认路由 ip route add default via 192.168.10.1 dev eth0 route add default gw 192.168.10.1 2.间接路由: ip ...
- PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比
公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题.根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致. 目前想到的是有两种方案解决,第一种就是把 ...
- P4316 绿豆蛙的归宿(期望)
P4316 绿豆蛙的归宿 因为非要用bfs所以稍微麻烦一点qwq(大家用的都是dfs) 其实问题让我们求的就是经过每条边的概率*边权之和 我们可以用bfs把图遍历一遍处理概率,顺便把每条边的概率*边权 ...
- linux配置powerline(bash/vim)美化
安装powerline需要pip 链接:https://pan.baidu.com/s/1Jc59VD35PYic2fTK5v8h1w 密码:otfp pip curl https://bootstr ...