题解
2025-05-21 21:19:39
发布于:北京
59阅读
0回复
0点赞
首先给出了限制 ,那么我们直接记录每一个位置上的,右边第一个 。
接下来制定贪心策略(注意:任意次操作,本入赛时没看到)。首先容易想到,最高位越大,二进制越大。所以,我们选择最左边的 作为 即可。
接下来, 要取 右方第一个 ,为什么呢?这样想,如果取到了第一个 ,那么它会变成 ,这样,下一次的 就可以取到 变成的 ,显然比其他位置更加优秀。
修改直接按题意即可。
Code:
#include<bits/stdc++.h> //%%% BaiRX
using namespace std;
int n,l,r;
int nxt[2][1000001];
string s;
int main(){
cin>>n>>s;
for(int i=n-1;i>=0;i--){
if(s[i]=='0'){
nxt[0][i]=i;
nxt[1][i]=nxt[1][i+1];
}
else{
nxt[0][i]=nxt[0][i+1];
nxt[1][i]=i;
}
}
l=nxt[0][0];
r=nxt[1][l];
while(l<r){
for(int i=l;i<=r;i++) s[i]^=1;
l=r;
r=nxt[1][l+1];
}
cout<<s;
return 0;
}
全部评论 2
你%我**呢
2025-05-21 来自 北京
0666直抒胸臆
2025-05-21 来自 北京
0
@BaiRX hhh
2025-05-21 来自 江西
0?
2025-05-21 来自 北京
0哦哦哦
2025-05-21 来自 北京
0
有帮助,赞一个