首页 > 其他分享 >[题解][洛谷P1633] 二进制

[题解][洛谷P1633] 二进制

时间:2024-10-04 18:36:44浏览次数:4  
标签:洛谷 int 题解 二进制 P1633 连续 考虑 数量 进位

题目描述
有三个整数A,B,C,构造三个整数X,Y,Z满足:
1.A,B,C在二进制下1的数量分别与X,Y,Z相等;
2.X,Y,Z在二进制下的长度不超过A,B,C的最大长度;
3.X+Y=Z。
输出Z的最小值,若不存在Z,输出-1。

题意分析
首先考虑X,Y在什么情况下会使1的数量发生改变。
设x,y,z分别表示X,Y,Z中1的数量,则有:
1)x+y<z时,不论怎么凑1都不能使1的数量增多,则无解;
2)x+y=z时,只要每一位都是1和0相加即可得到Z;
3)x+y>z时,此时1的数量更多,需要考虑通过进位消除1。
对于一段连续的1111,加上1变成10000。可以得到若干连续的1可以通过+1减少1的数量。
考虑如何得到最小的Z,若有多个连续进位,可以合并成一个连续进位,因此只需考虑一个连续进位。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int a[4]={0,0,0,0};
		int cnt[4]={0,0,0,0};
		int len[4]={0,0,0,0};
		cin>>a[1]>>a[2]>>a[3];
		for(int i=1;i<=3;i++){
			while(a[i]){
			if(a[i]%2)cnt[i]++;
			a[i]/=2;
			len[i]++;
			}
		}
		int l=max(len[1],max(len[2],len[3]));
		int L=max({cnt[1]+cnt[2]-cnt[3]+1+max(2*cnt[3]-cnt[2]-cnt[1],0),cnt[1]+1,cnt[2]+1});
		if(cnt[1]+cnt[2]-cnt[3]==0)cout<<(1<<cnt[3])-1<<"\n";
		else if(cnt[1]+cnt[2]-cnt[3]<0||!len[3])cout<<-1<<"\n";
		else if(L>l)cout<<-1<<"\n";
		else{
			int d=cnt[1]+cnt[2]-cnt[3];
			int ans=(1<<(L-1))+(1<<(L-d-1))-1;
			for(int i=L;i<cnt[1]+cnt[2];i++)ans|=1<<(i-d);
			cout<<ans<<"\n";
		}
	}
} 

DLC
是否有别的方法解决呢?
上述方法解决问题的规模是O(logn),由于X,Y,Z均处于230的规模,因此只能在O(logn5)的规模下解决。
考虑数位dp,以dp[s][i][j][k][0/1]表示执行到最低s位,A,B,C分别用了i,j,k个1,最高位产生/不产生进位下Z的最小值。
以此思路,只需枚举X,Y用1还是用0,就可以得到状态转移和Z的变化情况。

标签:洛谷,int,题解,二进制,P1633,连续,考虑,数量,进位
From: https://www.cnblogs.com/zwzww/p/18447099

相关文章

  • CF542C题解
    传送门:https://codeforces.com/problemset/problem/542/C我们把序列的映射关系看作\(i\rightarrowf(i)\)的边,要使\(f(f(i))=f(i)\),显然存在\(i\)点距离不超过\(1\)的长度为\(1\)的自环。推广到\(f^{(k)}(x)\)满足题意则会在距离\(x\)点距离不超过\(k\)的长度为\(k\)的环。我们......
  • CF242D题解
    传送门:https://codeforces.com/problemset/problem/242/D对于一个点,显然一旦达到额定值后,其他任何操作都无法使他减小,于是我们得出一个贪心性质,当且仅当一个点不合法时,才取增加他的值。同理,我们可以证明,问题必定有解,因为若一个点被选择,必定是因为其曾不合法,选择后使其\(+1\)合法,......
  • CF549B题解
    传送门:https://codeforces.com/problemset/problem/549/B和CF242C思路完全相同,对于一个点,显然一旦达到额定值后,其他任何操作都无法使他减小,于是我们得出一个贪心性质,当且仅当一个点不合法时,才取增加他的值。同理,我们可以证明,问题必定有解,因为若一个点被选择,必定是因为其曾不合法,......
  • [题解]P7077 [CSP-S2020] 函数调用
    P7077[CSP-S2020]函数调用题意简述给定一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),给定\(m\)个函数,每个函数可能是下面\(3\)种类型,用\(T_x\)表示函数\(x\)的类型:\(T_x=1\),对下标\(p\)增加\(v\)。\(T_x=2\),对所有元素乘\(v\)。\(T_x=3\),由若干类型\(1\)和类型\(2\)组成......
  • 【题解】B - 三元上升子序列
    目录题目内容DescriptionInputOutput数据规模与约定思路代码题目内容DescriptionErwin最近对一种叫thair的东西巨感兴趣。。。在含有\(n\)个整数的序列\(a_1,a_2,\ldots,a_n\)中,三个数被称作thair当且仅当\(i\ltj\ltk\)且\(a_i\lta_j\lta_k\)。求一个序列中thair......
  • BUUCTF_MISC题解析(3,4)
    3.你竟然赶我走搜索010editor官网,点第一个页面,下载010editor(十六进制编译器)(黄色图标),直接010editor打开(或者使用stegSolve)一般情况用ctrl+f进入字符串搜索查看是否有插入的flag信息,就可以在文件尾看到flag是flag{stego_is_s0_bor1ing} 4.二维码扫码识别二维码,发现隐......
  • 【题解】Solution Set - NOIP2024集训Day42 博弈论
    【题解】SolutionSet-NOIP2024集训Day42博弈论https://www.becoder.com.cn/contest/5574https://www.cnblogs.com/CloudWings/p/17813917.html「中山市选2009」谁能赢呢?一道经典的「二分图博弈」在棋盘问题上的应用。https://www.luogu.com.cn/article/h8a79k3i......
  • [题解](更新中)MX-X6 A~B
    Portal:https://www.luogu.com.cn/contest/200833A-もしも容易发现可以构造\(1,x\)或\(x,1\)让序列如\(\dots,1,x,1,x,1,x,\dots\)这样循环。只需要关注\(n\)的奇偶性即可。点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intt,n,an;si......
  • 洛谷P10336 [UESTCPC 2024] 2-聚类算法
    涉及知识点:博弈、贪心题意Alice和Bob在玩选点游戏,所有的点在一个\(k\)维空间中,他们轮流选走一个点放入自己的集合中,Alice先手。定义集合\(S\)的权值\(val(S)\)为集合中点两两之间的\(k\)维曼哈顿距离之和。Alice的得分为\(val(S_A)-val(S_B)\),Bob的得分为\(val(......
  • [题解]SFMOI Round I A~C
    Portal:https://www.luogu.com.cn/contest/179008\(\bf{100+50+50+25+5=\color{indianred}225\color{black}\,\rk.\184}\)A-StrangeCakeGame显然对于小W,向下移动蛋糕刀是最有利的;对于小M,向右移动是最有利的。所以双方以最佳状态移动,最终\(x\ley\)的巧克力是小W的。直接......