洛谷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

输入输出样例

输入样例#1:

4
7 6 9
1 1 1
1 1 4
3 3 9

输出样例#1:

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][2],a1,b1,c1;
int T,n;
int l(long long x){
    int cnt1=0,cnt2=0;
    while(x){
        cnt1++;
        if(x&1)cnt2++;
        x>>=1;
    }
    n=max(n,cnt1);
    return cnt2;
}
int main(){
    scanf("%d",&T);
    while(T--){
        cin>>a1>>b1>>c1;n=0;
        int A=l(a1),B=l(b1),C=l(c1);
        memset(f,127/3,sizeof(f));
        f[1][0][0][0][0]=0;
        for(int i=1;i<=n;i++){
            for(int a=0;a<=A;a++)
            for(int b=0;b<=B;b++)
            for(int c=0;c<=C;c++){
                long long v=f[i][a][b][c][0];
                f[i+1][a][b][c][0]=min(f[i+1][a][b][c][0],v);
                f[i+1][a+1][b+1][c][1]=min(f[i+1][a+1][b+1][c][1],v+(1<<i));
                f[i+1][a+1][b][c+1][0]=min(f[i+1][a+1][b][c+1][0],v+(1<<(i-1)));
                f[i+1][a][b+1][c+1][0]=min(f[i+1][a][b+1][c+1][0],v+(1<<(i-1)));
                v=f[i][a][b][c][1];
                f[i+1][a][b][c+1][0]=min(f[i+1][a][b][c+1][0],v);
                f[i+1][a+1][b+1][c+1][1]=min(f[i+1][a+1][b+1][c+1][1],v+(1<<i));
                f[i+1][a+1][b][c][1]=min(f[i+1][a+1][b][c][1],v+(1<<(i-1)));
                f[i+1][a][b+1][c][1]=min(f[i+1][a][b+1][c][1],v+(1<<(i-1)));
            }
        }
        if(f[n+1][A][B][C][0]>(1<<30))printf("-1\n");
        else cout<<f[n+1][A][B][C][0]<<endl;
    }
}
时间: 2024-08-27 04:54:17

洛谷P1633 二进制的相关文章

洛谷 P2104 二进制

P2104 二进制 题目描述 小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算: 运算 1:将整个二进制数加 1 运算 2:将整个二进制数减 1 运算 3:将整个二进制数乘 2 运算 4:将整个二进制数整除 2 小Z很想知道运算后的结果,他只好向你求助. (Ps:为了简化问题,数据保证+,-操作不会导致最高位的进位与退位) 输入输出格式 输入格式: 第一行两个正整数 n,m,表示原二进制数的长度以及运算数. 接下来一行 n 个字符,分别为‘0

洛谷——P1062 数列

洛谷——P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…) 请你求出这个序列的第N项的值(用10进制数表示). 例如,对于k=3,N=100,正确答案应该是981. 输入输出格式 输入格式: 输入文件只有1行,为2个正整数,用一个

洛谷P1940买蛋糕

题目传送门 题意:给定你一个数n,要求用最小个数的整数组成小于等于n的所有整数,并求出方案数. 很明显,擅长二进制的大犇们肯定一眼就看得出方案数是log2(n)+1,然而我并不擅长,但是推了一小会儿也就推出来了,证明也不难.那么问题就在于怎么求方案数,我个人使用的深搜,(当然网上有用DP的,然而我一向就不擅长DP(QAQ)),时间限制也放的很宽,有两秒,我用深搜最慢的点1100ms,也还算比较快了吧(或者是洛谷数据比较水?)反正也很容易了,看代码自己推一下应该很好懂 #include<cstdi

洛谷P2783 有机化学之神偶尔会作弊

题目传送门 啦啦啦,发个文纪念一下第一道在洛谷上A的黑题,一次性就过真是无比舒服-(虽然某些大佬说这题有点水……)题目其实思路不难,Tarjan缩点+LCA,不过因为是无向边,所以在Tarjan的时候做点标记就行了,不过第四个点会被卡,用vector存边就可以A掉了.另外输出用二进制这个应该没什么好说的. 下面放代码: #include<cmath> #include<stack> #include<vector> #include<cstdio> #inc

洛谷 P1784 数独[DFS/回溯]

To 洛谷.1784 数独类似题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战) 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的. 芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战. 这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”.

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不