洛谷P1633 二进制
P1633 二进制
题目描述
有三个整数A、B、C,以下用N(2)表示N的二进制(没有前导0)。
设A(2)、B(2)、C(2)的最大长度为L,你需要构造三个正整数X、Y、Z,满足以下条件:
(1) X(2)、Y(2)、Z(2)的长度都不超过L。
(2) A(2)与X(2)中1的个数相同。
(3) B(2)与Y(2)中1的个数相同。
(4) C(2)与Z(2)中1的个数相同。
(5) X+Y=Z.。
输入输出格式
输入格式:
第一行包含一个正整数T,表示有T组测试数据。
接下来T行,每行三个正整数A、B、C。
【数据规模】
对于30%的数据中,满足1<=A、B、C<=100;
对于100%的数据中,满足1<=T<=10,1<=A、B、C<=2^30。
输出格式:
输出共T行,每行一个答案。
输出最小的Z。如果没有z则输出-1
输入输出样例
4
7 6 9
1 1 1
1 1 4
3 3 9
10
-1
2
6
/*
我们考虑三个长度为l的串;
显然如果这3个串符合条件的话;
我们就只要保证增加2^l级别的值满足加法原则就好了;
所以我们大力dp;
f[i][a][b][c][0/1]
i表示位数
a表示x串前i-1个字符所有的1的数量;
b,c同理;
0/1表示c串在第i位是1还是0;
预处理
f[1][0][0][0][0]=0;其他都是inf;
转移就是考虑当前第i位a,b要不要放1;
然后对应的计算c新增的值;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 35
long long f[N][N][N][N][],a1,b1,c1;
int T,n;
int l(long long x){
int cnt1=,cnt2=;
while(x){
cnt1++;
if(x&)cnt2++;
x>>=;
}
n=max(n,cnt1);
return cnt2;
}
int main(){
scanf("%d",&T);
while(T--){
cin>>a1>>b1>>c1;n=;
int A=l(a1),B=l(b1),C=l(c1);
memset(f,/,sizeof(f));
f[][][][][]=;
for(int i=;i<=n;i++){
for(int a=;a<=A;a++)
for(int b=;b<=B;b++)
for(int c=;c<=C;c++){
long long v=f[i][a][b][c][];
f[i+][a][b][c][]=min(f[i+][a][b][c][],v);
f[i+][a+][b+][c][]=min(f[i+][a+][b+][c][],v+(<<i));
f[i+][a+][b][c+][]=min(f[i+][a+][b][c+][],v+(<<(i-)));
f[i+][a][b+][c+][]=min(f[i+][a][b+][c+][],v+(<<(i-)));
v=f[i][a][b][c][];
f[i+][a][b][c+][]=min(f[i+][a][b][c+][],v);
f[i+][a+][b+][c+][]=min(f[i+][a+][b+][c+][],v+(<<i));
f[i+][a+][b][c][]=min(f[i+][a+][b][c][],v+(<<(i-)));
f[i+][a][b+][c][]=min(f[i+][a][b+][c][],v+(<<(i-)));
}
}
if(f[n+][A][B][C][]>(<<))printf("-1\n");
else cout<<f[n+][A][B][C][]<<endl;
}
}
洛谷P1633 二进制的更多相关文章
- 洛谷P4428二进制 [BJOI2018] 线段树
正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个 ...
- 洛谷 P2104 二进制
P2104 二进制 题目描述 小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算: 运算 1:将整个二进制数加 1 运算 2:将整个二进制数减 1 ...
- 洛谷P2456 二进制方程
题目 字符串模拟+并查集 建立两个并查集分别存放每个变量的每一位数的祖先,一个是1一个是2 考虑每个字母的每一位的数都是唯一的,先模拟,记录每一个变量的每一位. 一一映射到方程中去,最后将两个方程进行 ...
- 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】
题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...
- Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)
题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...
- 洛谷P1017 进制转换
洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...
- 洛谷P1117 棋盘游戏
洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...
- 洛谷1377 M国王 (SCOI2005互不侵犯King)
洛谷1377 M国王 (SCOI2005互不侵犯King) 本题地址:http://www.luogu.org/problem/show?pid=1377 题目描述 天天都是n皇后,多么无聊啊.我们来 ...
- 洛谷 P1017 进制转换
推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...
随机推荐
- Flash+XML前后按钮超酷焦点图
在线演示 本地下载
- Dubbo之消费者
在写 dubbbo调用时候 <dubbo:reference 不能有空格! 项目结构: pom: <project xmlns="http://maven.apache.org ...
- WCF异常处理
[读书笔记] 在进行分布式应用的异常处理时需要解决和考虑的基本要素: 异常的封装:服务端抛出的异常如何序列化传递到客户端 敏感信息的屏蔽:抛出的异常往往包含一些敏感的信息,直接将服务操作执行过程抛出的 ...
- nginx日志分析命令记录
这是要注意的 可能因为 线上 nginx日志输出格式的不一样,一下命令未能展示正确的结果 流量速率分析的第三个命令 慢查询分析的第一二个命令 参考文档,nginx日志输出格式为 $remote_add ...
- python的上下文管理器-1
reference:https://zhuanlan.zhihu.com/p/26487659 来看看如何正确关闭一个文件. 普通版: def m1(): f = open("output. ...
- 使用libcurl,根据url下载对应html页面
1. [图片] Capture.JPG 2. [代码]GetPageByURL //static member variable definestring GetPageByURL::m_curPa ...
- 介绍 Java 的内存泄漏
java最明显的一个优势就是它的内存管理机制.你只需简单创建对象,java的垃圾回收机制负责分配和释放内存.然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏.脚本代码 本教程演示了什 ...
- 分享知识-快乐自己:SpringBoot结合使用拦截器(判断是否用户是否已登陆)
所有的开发之中拦截器一定是一个必须要使用的功能,利用拦截器可以更加有效的实现数据的验证处理,而且最为幸运的是在SpringBoot之中所使用的拦截器与Spring中的拦截器完全一样. 基础拦截器操作: ...
- 练习E-R图书管理数据库
- 局域网扫描IP
今天有朋友去面试,被问到一个“如何扫描局域网IP”的问题(即找出局域网中当前已使用的IP),朋友回答的不好,回来问我,我首先想到的就是使用ping命令将局域网可分配的IP地址逐个遍历一遍,能ping通 ...