3107: [cqoi2013]二进制a+b

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 995  Solved: 444
[Submit][Status][Discuss]

Description

输入三个整数a, b, c,把它们写成无前导0的二进制整数。比如a=7, b=6, c=9,写成二进制为a=111, b=110, c=1001。接下来以位数最多的为基准,其他整数在前面添加前导0,使得a, b, c拥有相同的位数。比如在刚才的例子中,添加完前导0后为a=0111, b=0110, c=1001。最后,把a, b, c的各位进行重排,得到a’, b’, c’,使得a’+b’=c’。比如在刚才的例子中,可以这样重排:a’=0111, b’=0011, c’=1010。
你的任务是让c’最小。如果无解,输出-1。
 

Input

输入仅一行,包含三个整数a, b, c。
 

Output

 
输出仅一行,为c’的最小值。

Sample Input

7 6 9

Sample Output

10

HINT

a,b,c<=2^30

题解:

参考代码:dp[i][j][k][l][m]表示:第I位,第1,2,3个数分别用了几个一,m表示是否有进位:

分类讨论:

  对于m=0的情况: 

   dp[i+1][j+1][k+1][l+1][1]=min(dp[i+1][j+1][k+1][l+1][1],tmp+(1<<i+1));
dp[i+1][j+1][k][l+1][0]=min(dp[i+1][j+1][k][l+1][0],tmp+(1<<i));
dp[i+1][j][k+1][l+1][0]=min(dp[i+1][j][k+1][l+1][0],tmp+(1<<i));
dp[i+1][j][k][l][0]=min(dp[i+1][j][k][l][0],tmp);
 对于m=1的情况:
    dp[i+1][j+1][k+1][l+1][1]=min(dp[i+1][j+1][k+1][l+1][1],tmp+(1<<i+1));
dp[i+1][j][k+1][l][1]=min(dp[i+1][j][k+1][l][1],tmp+(1<<i));
dp[i+1][j+1][k][l][1]=min(dp[i+1][j+1][k][l][1],tmp+(1<<i));
dp[i+1][j][k][l][0]=min(dp[i+1][j][k][l][0],tmp);
 #include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3fll;
ll a,b,c;
ll la,lb,lc,len;
ll dp[][][][][];
void getlen(){len=max(log2(a)+,max(log2(b)+,log2(c)+));}
ll getnum(ll x)
{
ll sum=;
for(int i=;i<;++i) {if( x & (1ll<<i) ) sum++; }
return sum;
}
void work()
{
dp[][][][][]=;
for(ll i=;i<len;++i)
{
for(ll j=;j<=la;++j)
{
for(ll k=;k<=lb;++k)
{
for(ll l=;l<=lc;++l)
{
long long tmp=dp[i][j][k][l][];//枚举最后一位不进位的情况
dp[i+][j+][k+][l+][]=min(dp[i+][j+][k+][l+][],tmp+(<<i+));
dp[i+][j+][k][l+][]=min(dp[i+][j+][k][l+][],tmp+(<<i));
dp[i+][j][k+][l+][]=min(dp[i+][j][k+][l+][],tmp+(<<i));
dp[i+][j][k][l][]=min(dp[i+][j][k][l][],tmp);
tmp=dp[i][j][k][l][];//枚举最后一位进位的情况
dp[i+][j+][k+][l+][]=min(dp[i+][j+][k+][l+][],tmp+(<<i+));
dp[i+][j][k+][l][]=min(dp[i+][j][k+][l][],tmp+(<<i));
dp[i+][j+][k][l][]=min(dp[i+][j+][k][l][],tmp+(<<i));
dp[i+][j][k][l][]=min(dp[i+][j][k][l][],tmp);
}
}
}
}
//cout<<len<<" "<<la<<" "<<lb<<" "<<lc<<endl;
if(dp[len][la][lb][lc][]>=inf) printf("-1\n");
else printf("%d\n",dp[len][la][lb][lc][]);
} int main()
{
scanf("%lld%lld%lld",&a,&b,&c);
getlen(); memset(dp,inf,sizeof dp);
la=getnum(a);lb=getnum(b);lc=getnum(c);
work();
return ;
}

  

BZOJ 3107 [cqoi2013]二进制a+b (DP)的更多相关文章

  1. bzoj 5294: [Bjoi2018]二进制【动态dp+线段树】

    不太清楚是不是动态dp--? 这个维护其实和最大连续子段差不多,维护l[x][y],r[x][y],m[x][y]分别表示包含左儿子的01个数为(x,y)的区间个数,包含右儿子的01个数为(x,y)的 ...

  2. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  3. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  4. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]

    4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...

  5. Bzoj 1055: [HAOI2008]玩具取名 (区间DP)

    Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...

  6. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  7. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  8. BZOJ 3107 二进制a+b

    Description 输入三个整数\(a, b, c\),把它们写成无前导\(0\)的二进制整数.比如\(a=7, b=6, c=9\),写成二进制为\(a=111, b=110, c=1001\) ...

  9. BZOJ.4513.[SDOI2016]储能表(数位DP)

    BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...

随机推荐

  1. 配置SElinux环境,将SELinux设置为enforcing

    SELinux是 美国国家安全局 (NSA) 对于 强制访问控制的实现 =>可以使root受限的权限 关闭SELinux=>修改配置文件,永久生效; sed -i 's/SELINUX=e ...

  2. LeetCode18. 四数之和

    LeetCode18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值 ...

  3. nyoj 62-笨小熊(以对应数组中的ASC位 + 1)

    62-笨小熊 内存限制:64MB 时间限制:2000ms Special Judge: No accepted:15 submit:43 题目描述: 笨小熊的词汇量很小,所以每次做英语选择题的时候都很 ...

  4. SpringBoot 配置文件与依赖库分离打包配置

    一.应用场景 一般情况下我们对springboot应用打包时使用springboot的maven插件spring-boot-maven-plugin的maven进行打包,打包完成得到一个fatjar, ...

  5. rhel-6.3-i386安装samba

    1.安装samba 1).安装软件 rpm –ivh /mnt/Packages/samba-3.5.10-125.el6.i686.rpm 2).创建用户 useradd myadmin 3).设置 ...

  6. flex盒子布局

    看过很多对于弹性盒子flex的简介,但还是觉得阮一峰大神的解析和张鑫旭大神(旧版flex)的解析比较容易理解,下面,我以自己的理解来叙述关于flex弹性布局! 1.概念(容器和项目) 在flex中,有 ...

  7. python_07

    破解极限滑动认证 from selenium import webdriver from selenium.webdriver import ActionChains from PIL import ...

  8. Ubuntu 16.04安装ROS Kinetic详细教程 | Tutorial to Install and Configure ROS Kinetic on Ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/e2780b93/,欢迎阅读! Tutorial to Install and Configure ROS Kinetic on U ...

  9. TypeScript SDK 和 REST API

    在本文中,我们将讨论CUBA平台中已经存在很长时间的一个功能,但是很多人还不知道,这就是前端SDK生成器,并了解它如何与CUBA的REST API插件一起使用. Java+JavaScript - 在 ...

  10. Java w3c离线手册

    提供给大家使用,懒得找: 前端后端一般都用的到  查看文档 1. JDK_API_1_6_zh_CN.CHM 2.     W3School离线手册(2018.04.01).chm 3.    jqu ...