D. String Deletion
题意:
给你一个01串。
每次操作:
- 要选择一个位置,之后删去这个位置。
- 然后删去相等元素的前缀。
求:
最大的操作次数。
思路:
- 假如是111110101.那么这种情况时,为了不浪费这个
前缀
,所以要对这个前缀
进行操作. ans+1. - 假如是这种情况时。 1010111.为了使答案最大。后面的三个1肯定可以一个一个去。
(有些时候0101可以留到最后去,但是在这情时:对于这111的 l e n = 3 len=3 len=3,111前面可能有1个0,)所以要看下能否消化后面的两个1. - 最后加上答案即可。
AC(高中生%%%%%%%%)
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
char s[maxn];
int main()
{
ios::sync_with_stdio(0);
int tt;cin>>tt;
while(tt--){
int ans=0,n;
cin>>n>>s;
vector<int>v;
int i,j;
for(i=0; i<n; i=j){
for(j=i; j<n&&s[i]==s[j]; j++);
v.push_back(j-i);
}
for(i=0; i<v.size(); i++)ans=min(i+1,ans+v[i]-1);
ans=ans+(v.size()-ans+1)/2;
cout<<ans<<endl;
}
return 0;
}