Codeforces 603A Alternative Thinking (思维)
题意
给一个01串,找出一个子串翻转,使得最长的01序列最长。
思路
一开始我以为是个贪心模拟,就是把最长的连续0或者连续1中和两边不相邻的地方一半反转,然后特判一下最长是2的连续最长的话,头尾的11或者00。但是死在这组:
56 10101011010101010101010101010101010101011010101010101010
我又特判了一个连续最长是2的情况下两个11或者两个00之间的全部反转。。。死在test7。
50 01011010110101010101010101010101010101010101010100
我又想了一下把两个任意长度的连续串之间的都反转了,然后死在test5:
11 00000000000
然后就不行了,我回去看题解吧2333
其实这题就是找规律一样的,不管是什么子串,反转后最多在原本的基础上多两个(毕竟只有两种字符),所以答案就是
min(n,MaxAlternativeSubsequenceLength + 2)
代码
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
string s;
cin>>s;
int counter=1;
bool iszero=false;
if(s[0]=='0')
{
iszero=true;
}
for(int i=1;i<n;i++)
{
if(iszero)
{
if(s[i]=='1')
{
iszero=false;
counter++;
}
} else{
if(s[i]=='0')
{
iszero=true;
counter++;
}
}
}
cout<<min(counter+2,n)<<endl;
return 0;
}
参考了以下文章,在此表示感谢: