社区讨论
贪心过了,求证明/hack
P11218【MX-S4-T2】「yyOI R2」youyou 不喜欢夏天参与者 6已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @m2hlzext
- 此快照首次捕获于
- 2024/10/20 21:13 去年
- 此快照最后确认于
- 2025/11/04 16:40 4 个月前
写了个类似求最大子段和的贪心,直接过了,不会证也不会hack,求助
CPP#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read(){
ll X = 0,r = 1;
char ch = getchar();
while(!isdigit(ch) && ch != '-') ch = getchar();
if(ch == '-') r = -1,ch = getchar();
while(isdigit(ch)) X = X*10+ch-'0',ch = getchar();
return X*r;
}
const int N = 2e6+10;
int n,m,type[N];
char s[2][N];
int solve(){
int ans = 0,sum = 0;
for(int i=1;i<=n;i++){
if(s[0][i] == '1' && s[1][i] == '1') type[i] = 1;
if(s[0][i] == '0' && s[1][i] == '0') type[i] = 2;
if(s[0][i] == '1' && s[1][i] == '0') type[i] = 3;
if(s[0][i] == '0' && s[1][i] == '1') type[i] = 4;
}
for(int i=1;i<=n;i++){
if(type[i] == 1) sum += 2;
if(type[i] == 2) sum--;
ans = max(ans,sum);
sum = max(sum,0);
}
sum = 0;
int flag = 3;
for(int i=1;i<=n;i++){
if(type[i] == 1) flag = 3,sum += 2;
else if(type[i] == 2) sum--;
else if(type[i] == 3){
if(flag & 1){
flag = 1;
sum++;
}else flag = 3;
}else{
if(flag & 2){
flag = 2;
sum++;
}else flag = 3;
}
ans = max(ans,sum-2*m);
if(sum <= 0) sum = 0,flag = 3;
}
return ans;
}
int main(){
// freopen("summer.in","r",stdin);
// freopen("summer.out","w",stdout);
int C = read(),T = read();
while(T--){
n = read(); m = read();
scanf("%s",s[0]+1);
scanf("%s",s[1]+1);
cout << solve() << "\n";
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...