题意与分析 (CodeForces - 603A)

这题真的做的我头疼的不得了,各种构造样例去分析性质。。。

题意是这样的:给出01字符串。可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所有的位取反。求经过处理后最多会得到多少次01变换(可以不连续)。

首先求原串的最长01长度,这个太简单了,然后才是重头戏:精彩的构造样例分类讨论环节——如何增加01的最长串?

我们考虑一下反转串的几种情况:1、反转单个连续0/1串的内部;2、反转两个部分连续0/1串与中间的内容(内部无连续串)3、反转两个部分连续0/1串与中间的内容(内部有连续串)4、反转连续01串(不是0/1串!)

第一种情况是最好考虑的,不论你是1000..0001还是0111...11110,里面不论怎么反转,最后对答案的贡献也多一个01/10,也就是2。这种多的贡献仅仅出现在0/1串长度大于等于三的情况。

第二种情况稍微复杂一些:先考虑0开头的情况,也就是00..0{101010101}1..11或者00..0{101010101}0..00。这种情况下最好的处理是连着前后一个字符一起反转:00..1{010101010}0..11于是长度喜多2。这种情况下,前面跟着一个串(长度大于等于2即可)就产生1的贡献,后面跟着一个就产生一个贡献。1开头的同理。

第三种情况建立在2的基础上:如果反转串中间也有连续会怎样?什么时期都不会发生,因为它作出的贡献仅仅相当于一个单个字符。于是答案同2。

第四种情况比较有趣了:我对原答案做反转,没有连续的01会怎样?那你不管怎么样,最优答案总是原先的最长长度。

综合以上四种情况,我们可以得到这个结论:

如果整个串里面的00/11串个数\(\le 2\),那么答案(即原先长度)加上这个串的个数;否则答案最多+2。情况1此时已经被包括在内了,因为长度为3的连续串一定有两个00/11串。

代码

/*
* Filename: cfr334d2c.cpp
* Date: 2018-11-05
*/ #include <bits/stdc++.h> #define INF 0x3f3f3f3f
#define PB emplace_back
#define MP make_pair
#define fi first
#define se second
#define rep(i,a,b) for(repType i=(a); i<=(b); ++i)
#define per(i,a,b) for(repType i=(a); i>=(b); --i)
#define ZERO(x) memset(x, 0, sizeof(x))
#define MS(x,y) memset(x, y, sizeof(x))
#define ALL(x) (x).begin(), (x).end() #define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define DEBUG(...) fprintf(stderr, __VA_ARGS__), fflush(stderr) using namespace std;
using pi=pair<int,int>;
using repType=int;
using ll=long long;
using ld=long double;
using ull=unsigned long long; int dp[100005][2]; int
main()
{
int n; cin>>n;
bool b[100005];
string str; cin>>str;
int maxlen=0,nowlen=0;
bool last;
int cnt=0;
rep(i,0,n-1)
{
b[i+1]=str[i]=='0';
if(i==0)
{
dp[i+1][0]=str[i]=='0';
dp[i+1][1]=str[i]=='1';
last=b[i+1];
nowlen=1;
}
else
{
if(last==b[i+1])
{
nowlen++;
maxlen=max(nowlen,maxlen);
}
else
{
cnt+=nowlen-1;
nowlen=1;
last=b[i+1];
}
if(str[i]=='0')
{
dp[i+1][1]=dp[i][1];
dp[i+1][0]=dp[i][1]+1;
}
else
{
dp[i+1][1]=dp[i][0]+1;
dp[i+1][0]=dp[i][0];
}
}
}
if(nowlen!=1) cnt+=nowlen-1;
int ans=0;
rep(i,1,n)
ans=max(ans,max(dp[i][0],dp[i][1]));
/*
rep(i,1,n)
cout<<dp[i][0]<<" ";
cout<<endl;
rep(i,1,n)
cout<<dp[i][1]<<" ";
cout<<endl;
*/
cout<<ans+min(2,cnt)<<endl;
return 0;
}

「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)的更多相关文章

  1. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  2. 「日常训练」Queue(Codeforces Round 303 Div.2 D)

    简单到让人不敢相信是D题,但是还是疏忽了一点. 题意与分析 (Codeforces 545D) 题意:n人排队,当一个人排队的时间超过他需要服务的时间就会厌烦,现在要求一个最优排列使得厌烦的人最少. ...

  3. 「日常训练」Woodcutters(Codeforces Round 303 Div.2 C)

    这题惨遭被卡..卡了一个小时,太真实了. 题意与分析 (Codeforces 545C) 题意:给定\(n\)棵树,在\(x\)位置,高为\(h\),然后可以左倒右倒,然后倒下去会占据\([x-h,x ...

  4. 「日常训练」Skills(Codeforce Round #339 Div.2 D)

    题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...

  5. 「专题训练」k-Tree(CodeForces Round #247 Div.2 C)

    题意与分析(Codeforces-431C) 题意是这样的:给出K-Tree--一个无限增长的树,它的每个结点都恰有\(K\)个孩子,每个节点到它\(K\)个孩子的\(K\)条边的权重各为\(1,2, ...

  6. 「专题训练」Boredom(CodeForces Round #260 Div.1 A)

    题意(Codeforces-455A) 给你\(n\)个数,你每次可以选择删除去一个数\(x\)获得\(x\)分,但是所有为\(x+1\)和\(x-1\)的数都得删去.问最大获得分数. 分析 这是一条 ...

  7. Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题

    A. Uncowed Forces Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/604/pro ...

  8. 「日常训练」Watering Flowers(Codeforces Round #340 Div.2 C)

    题意与分析 (CodeForces 617C) 题意是这样的:一个花圃中有若干花和两个喷泉,你可以调节水的压力使得两个喷泉各自分别以\(r_1\)和\(r_2\)为最远距离向外喷水.你需要调整\(r_ ...

  9. 「日常训练」More Cowbell(Codeforces Round #334 Div.2 B)

    题意与分析(CodeForces 604B) 题意是这样的:\(n\)个数字,\(k\)个盒子,把\(n\)个数放入\(k\)个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少(水题) 不 ...

随机推荐

  1. tensorflow的一些函数

    1.tf.constant(value,dtype=None,shape=None,name='Const') 注意这个函数创造的是一个常数tensor,而不是一个具体的常数 value:即可以是li ...

  2. JavaWeb之session应用

    session和cookie都是用来存储信息的,区别是session是在服务器端存储信息,而cookie则是在浏览器端存储信息. 通常服务器端存储session,服务器端存储和获取session,一般 ...

  3. 配置git

    https://blog.csdn.net/qq_34446663/article/details/81106018

  4. PAT——1001. 害死人不偿命的(3n+1)猜想

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...

  5. 【SQLSERVER学习笔记】分页存储过程+调用

    USE [数据库名] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[存储过程名] @pageI ...

  6. php auto_prepend_file和auto_append_file的妙用

    这是一个鲜为人知的设置! auto_prepend_file 和 auto_append_file 是在php.ini中进行配置的2个参数,auto_prepend_file 表示在php程序加载第一 ...

  7. day01 三级菜单

    知识点: 字典, for 循环,if ...else 嵌套 永辉超市 = { '食品饮料':{ '休闲食品':{ '坚果':['山核桃','腰果'], '炒货':['瓜子','花生'] }, '牛奶' ...

  8. 转:system.Security.Cryptography C# 加密和解密

    以下文转自: http://www.360doc.com/content/13/0122/05/19147_261678471.shtml 总结:注册的时候经过MD5加密存进数据库,在登录的时候需要先 ...

  9. Centos7单网卡带VLAN多IP配置

    1.需要使用到vconfig软件,首先yum安装vconfig: 使用指令yum install vconfig:(若是本机找不到vconfig安装包,可以通过其他centos7安装yum-utils ...

  10. 关于nodejs下载组件经常失败的问题

    由于最近在刚开始做一个前台element和mybatisplus的项目,但是在使用nodejs下载vue的脚手架和各种组件时,会经常出现下载失败的问题,进而导致前台无法启动. 在网上查询之后发现在下载 ...