div3 F 题求调
  • 板块学术版
  • 楼主封禁用户
  • 当前回复24
  • 已保存回复24
  • 发布时间2023/7/14 21:07
  • 上次更新2023/11/3 09:48:48
查看原帖
div3 F 题求调
734533
封禁用户楼主2023/7/14 21:07

思路:找到第一个 11,将其之后连续的 00 最多的那个右端点与这个 11 的位置进行翻转。例:10001000100,连续 00 的最大值为 33,第一次出现的右端点下标为 77,故答案为:00010001100。

#include<bits/stdc++.h>
using namespace std;
#define int long long
char s[100000];
int ll=-1,rr=-1;
signed main(){
	cin>>s;
	for(int l=0;l<strlen(s);l++){
		if(s[l]=='1'){
			ll=l;
			break;
		}
	}
	int maxx=0,where=-1,now_ans=0,kk=-1;	
	for(int r=strlen(s)-1;r>=ll;r--){
		if(s[r]=='1'){
			if(now_ans>maxx){
				maxx=now_ans;
				where=kk;
			}
			now_ans=0;
			kk=-1;
		}
		else if(s[r]=='0'){
			if(kk==-1){					
				kk=r;
			}
			now_ans++;
		}
	}
	if(now_ans>maxx){
		maxx=now_ans;
		where=kk;
	}	
	rr=where;
	if((ll==rr&&ll==-1)){
		for(int i=0;i<strlen(s);i++){
			cout<<s[i];
		}
	}
	else{
		for(int i=0;i<ll;i++){
			cout<<s[i];
		}
		for(int i=rr;i>=ll;i--){
			cout<<s[i];
		}
		for(int i=rr+1;i<strlen(s);i++){
			cout<<s[i];
		}
	}
	return 0;
}
//101001
//01111000
//00011010
2023/7/14 21:07
加载中...