题解:CF2266C AND, OR, Sort!
解题思路
容易想到若要令修改后的字符串
然后思考
- 如果把
1 修改为0 ,则其前缀必须有0 ; - 如果把
0 修改为1 ,则其前缀必须有1 ;
也就是说,若
我们先预处理前缀
若
若
剩下的情况都围绕“枚举
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int pre[N], suf[N]; // 前/后缀 1/0的个数
void solve() {
int n; string s;
cin >> n >> s;
s = ' ' + s; // 把下标转成 1-base
pre[0] = suf[n + 1] = 0; // 别忘了初始化
for (int i = 1; i <= n; ++i)
pre[i] = pre[i - 1] + (s[i] == '1');
for (int i = n; i >= 1; --i)
suf[i] = suf[i + 1] + (s[i] == '0');
if (s[1] == '1') return cout << suf[1] << '\n', void();
int ans = 1e9;
for (int i = 1; i <= n; ++i)
ans = min(ans, pre[i - 1] + suf[i + 1]);
cout << ans << '\n';
}
int main( ) {
int T; cin >> T;
while (T--) solve();
return 0;
}