2023“钉耙编程”中国大学生算法设计超级联赛(2)Binary Number

2023“钉耙编程”中国大学生算法设计超级联赛(2)Binary Number

题目大意

给定一个二进制数,按每一位记为 s 1 ∼ s n s_1\sim s_n s1sn s 1 s_1 s1是最高位, s n s_n sn是最低位)。你需要进行恰好 k k k次操作:

  • 任意选择一个区间 [ l , r ] [l,r] [l,r],将 s l , s l + 1 , … , s r s_l,s_{l+1},\dots,s_r sl,sl+1,,sr翻转

也就是说,对于所有的 i ∈ [ l , r ] i\in[l,r] i[l,r],如果 s i s_i si 0 0 0,则将 s i s_i si变为 1 1 1;如果 s i s_i si 1 1 1,则将 s i s_i si变为 0 0 0

求进行了 k k k次操作以后,最大的结果二进制数是多少。

t t t组数据。

1 ≤ t ≤ 6 × 1 0 4 , 1 ≤ n ≤ 1 0 5 , 0 ≤ k ≤ 1 0 18 1\leq t\leq 6\times 10^4,1\leq n\leq 10^5,0\leq k\leq 10^{18} 1t6×104,1n105,0k1018

s 1 = 1 s_1=1 s1=1,对于所有 i ∈ [ 2 , n ] i\in[2,n] i[2,n] s i ∈ { 0 , 1 } s_i\in\{0,1\} si{0,1}

数据保证 ∑ n ≤ 2.5 × 1 0 6 \sum n\leq 2.5\times 10^6 n2.5×106


题解

n = 1 n=1 n=1时,输入只可能是 1 1 1,若 k k k为奇数则输出 0 0 0,否则输出1$。

n > 1 n>1 n>1时,我们从高位到低位看,把高位的连续的 0 0 0改为 1 1 1是最优的。如果 k k k小于连续的 0 0 0的段数,则从高位到低位把连续的 0 0 0改为 1 1 1;如果 k k k大于连续的 0 0 0的段数,则将全部的 0 0 0都变为 1 1 1,然后将多余的操作次数消去即可。如果多出偶数次操作,则全部选 [ 1 , 1 ] [1,1] [1,1]则可以互相抵消;如果多出奇数次操作,则可以先消去偶数部分,再用剩下的一次操作消去,比如将操作 [ 2 , 5 ] [2,5] [2,5]分为 [ 2 , 3 ] [2,3] [2,3] [ 4 , 5 ] [4,5] [4,5],或将操作 [ 1 , 1 ] [1,1] [1,1]分为 [ 1 , 2 ] [1,2] [1,2] [ 2 , 2 ] [2,2] [2,2]

还有一种特殊情况,当 k = 1 k=1 k=1 s = 11 … 11 s=11\dots 11 s=1111时,只能将最低位翻转,得到 11 … 10 11\dots 10 1110

时间复杂度为 O ( n ) O(n) O(n)

code

#include<bits/stdc++.h>
using namespace std;
int t,n,vt;
long long k;
char s[100005];
int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%d%lld",&n,&k);
		scanf("%s",s+1);
		if(n==1){
			printf("%d\n",(k^1)&1);
			continue;
		}
		vt=0;
		for(int i=1;i<=n;i++){
			if(s[i]=='0'){
				while(i+1<=n&&s[i+1]=='0') ++i;
				++vt;
			}
		}
		if(vt==0&&k==1){
			for(int i=1;i<=n-1;i++) printf("1");
			printf("0\n");
		}
		else{
			for(int i=1;i<=n;i++){
				if(s[i]=='0'){
					if(!k) break;
					--k;
					s[i]='1';
					while(i+1<=n&&s[i+1]=='0') s[++i]='1';
				}
			}
			printf("%s\n",s+1);
		}
	}
	return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学群体。无论你是计算机相关专业的学,还是对其他领域编程感兴趣的学,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学群体。无论你是计算机相关专业的学,还是对其他领域编程感兴趣的学,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学群体。无论你是计算机相关专业的学,还是对其他领域编程感兴趣的学,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学群体。无论你是计算机相关专业的学,还是对其他领域编程感兴趣的学,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值