Educational Codeforces Round 96 (Rated for Div. 2) D. String Deletion
前缀和,从左向右,如果当前的前缀和大于1的时候,++ans
如果当前的前缀和等于1,则从距当前最近的前缀和处减一
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define pu push #define pb push_back #define mp make_pair #define eps 1e-7 #define fi first #define sc second #define SORT(x) sort(x.begin(),x.end()) #define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end()) #define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin()) #define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin()) typedef long long i64; using namespace std; template<typename T> using twin = pair<T, T>; void solve() { vector<int> vec; int n, cnt = 0; cin >> n; string str; cin >> str; int cnt0 = 0,cnt1 = 0; for(int i=0;i!=n;++i){ if(str[i] == '1'){ ++cnt1; if(i > 0 && str[i-1] == '0'){ vec.pb(cnt0); cnt0 = 0; } }else{ ++cnt0; if(i > 0 && str[i-1] == '1'){ vec.pb(cnt1); cnt1 = 0; } } } if(cnt0) vec.pb(cnt0); if(cnt1) vec.pb(cnt1); //important 从前往后贪心 int len = SIZE(vec), ans = 0; for(int i=0;i!=len;++i) ans = min(i + 1, vec[i] - 1 + ans); ans += ((len - ans + 1) >> 1); cout << ans << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) solve(); return 0; }
不怕万人阻挡,只怕自己投降。
posted on 2020-10-15 16:49 chengyulala 阅读(67) 评论(0) 编辑 收藏 举报