首页 > 其他分享 >2023南海区信息学区赛(初中组) T1二进制整除

2023南海区信息学区赛(初中组) T1二进制整除

时间:2023-12-23 19:22:05浏览次数:27  
标签:输出 二进制 后面 2023 南海区 int 倍数 区赛 --

第1题     二进制整除 查看测评数据信息

交换二进制数相邻两个位置的数字,需要花费1元的代价。

读入整数n以及n位二进制数(也许有前导0),你需要依次回答n个独立的问题,第i个问题(1<=i<=n)是这样的:

假如要使得读入的二进制数是2^i的倍数,至少需要花费多少元的代价?如果不可能,则输出-1。

注意:每个问题都是独立的,不会相互影响,也就是说,每个问题只是假设,不会真的改变n位二进制数,纯粹是为了计算答案而已。

输入格式

 

第一行,一个整数n。1<=n<=100000。

第二行,n位二进制数,每位是0或1。

【提示】

60%的数据,n<=10。

 

输出格式

 

一行,共n个整数。

 

输入/输出例子1

输入:

5

10101

 

输出:

1 3 -1 -1 -1 

 

样例解释

 

分析:

注意这里,使二进制数是2^i的倍数,其实就可以转化为,能不能把二进制变成1后面全都是0

比如样例中

10101

i=1

想要为2^1的倍数,在i+1之前的位置都必须为0

 

 

原数2^0+2^2+2^4,=1+4+16=21

改变后2^1+2^2+2^4=2+4+16=22

22%2^1=22%2=0

为什么呢?因为至少满足i^2的倍数,那i+1这个位必须为1,然后他后面的数为1为0都行

2^1+2^2+2^4

看i=1后面的

拆解成

2+2*2+2*2*2*2

后面的数必然为i这个数的倍数,因为每个数都是i这个数乘了一定数量的2(都是在i这个数的基础上乘了很多个2),相加起来也就是很多个2相乘,加上i对应的数(这里是2*1),那么肯定为i这里的数的倍数

 但是前面的数不一定,因为并不是在i的基础上乘的

 

问题转化成了

i+1为1,包含i和i后面的数全为0最少交换几次

 

怎么找?有学长说并查集(没学不说。。)

我们模拟并查集(可能)

用双指针i,j定位0,1的位置

i是1,j是0,找到后交换

交换次数可以理解为

i-j,并不用真的一个一个统计,举例说明

 

#include <bits/stdc++.h>
using namespace std;

const int N=100005;
int n, i=0, j=0, ans=0, m=0, a[N], t=0;
char s[N];
int main()
{
	scanf("%d%s", &n, s+1);
	i=n, j=n;
    for (int k=1; k<=n; k++)
    	a[k]=-1;
	for (int k=n; k>=1; k--)
		if (s[k]=='0') a[n-k+1]=0; //1
		else break;
	for (int k=1; k<=n; k++)
	{
		ans+=i-j;
		a[n-i+1]=ans; //2
		
		while (s[i]!='1' && i>=1) i--; //3
		if (j>=i) j=i-1;//4
		while (s[j]!='0' && j>=1) j--;//5
		if (i<1 || j<1) break;	
		swap(s[i], s[j]);
	}
	
	for (int k=1; k<=n; k++)
		printf("%d ", a[k]);
	return 0;
}

  

1 注意这里,后面尾巴的零要特殊判断,这里卡了我好久  例如1010,0正常是无法处理的,会是-1次,但是实际上为0次
2 由于是从n往后,答案是倒着的,不好输出,统计起来答案
3 注意i>=1,否则可能越界
4 这里卡了1小时了快,只有j在i的后面才把j放i前面来,否则的话j按原位继续往下找,必须加if,不然时间超了,每次都重复回i来浪费了时间
5 同3

 

标签:输出,二进制,后面,2023,南海区,int,倍数,区赛,--
From: https://www.cnblogs.com/didiao233/p/17923493.html

相关文章

  • 2023-2024-1 20231416《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标自学《C语言程序设计》第十二章并完成云班课测试作业正文 https://www.cnblogs.co......
  • 按马哥教育关于2023版Linux云计算SRE工程师掌握知识类别,你会了哪些?
    模块1:Linux新手快速基础入门模块2:面试必备-企业级Shell脚本编程实战模块3:Linux系统结构、内核、进程进阶模块4:网络管理管理及互联网通信实战模块5:互联网常见服务应用实战模块6:网络安全、加密及安全通信实战模块7:安全加固内核防火墙Iptables模块8:企业级Web-LA/NMP架......
  • Test20231016
    考得真烂。被初一dalao薄纱。[题面+std](https://www.wenshushu.cn/drive/cfraky1du37)。T1:数学结论题:裴蜀定理,即:$a\timesx+b\timesy=\gcd(a,b)$T2:小清新贪心题,清楚一点性质**从点$i\toj(j>i)$然后又从点$j\tok(j>k)$那么为什么不能从$i$直接到$k$呢?**根据......
  • 2023-12-23训练总结
    T1计数ProblemDescriptionInputOutputSampleInputCopy210SampleOutputCopy90DataConstraint忘记初始化了调了半个小时。维护\(f_{i,0/1}\)表示长度为\(i\),最高位为\(0\)/不为\(0\)的合法方案数。明显有:\[f_{i,0}\getsf_{i-1,1}\\f_{i,1}\g......
  • 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T
    2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭现在军队只找到了1只小船,这船最多能同时坐上2个士兵。当1个士兵划船过河,用时为a[i]当2个士兵坐船同时划船过河时,用时为max(a[j],a[i])两士兵中用时最......
  • 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T
    2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭现在军队只找到了1只小船,这船最多能同时坐上2个士兵。当1个士兵划船过河,用时为a[i]当2个士兵坐船同时划船过河时,用时为max(a[j],a[i])两士......
  • [CSP-S 2023] 密码锁
    题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从\(0\)到\(9\)的数字。每个拨圈都是从\(0\)到\(9\)的循环,即\(9\)拨动一个位置后可以变成\(0\)或\(8\),因为校园里比较安全,小Y采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度......
  • 2023.12.23模拟赛总结
    前言:这次比赛又是tm的AB组一起打,tm的题目怎么一点质量都没有啊,三道简单题+一道模板题,而且模板我还没做过,而且我的一个部分换成那个模板就A了这次300pts,rank3,感觉不太好T1dp,\(f[i][0/1]\)表示i位置填0/1的方案数,直接转移,写高精度T2感觉应该放T4,实际最难首先,我们设跳楼机从0开......
  • 2023-2024-1 20231303 《计算机基础与程序设计》赵泊瑄第十三周学习总结
    2023-2024-120231303《计算机基础与程序设计》赵泊瑄第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接https://i.cnblogs.com/posts/edit)这个作业的目标总结第十三周学习收获作业正文2023-......
  • 2023-2024-1 20231419 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231419《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标自学《C语言程序设......