题意与分析 (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. luogu P1522 Cow Tours

    嘟嘟嘟 题面挺绕的,“翻译”一下: 1.牧区是一个点,牧场是所有直接相连的点构成的联通块. 2.两个牧区之间的距离是这两个距离之间的最短路,只有直接相连的两个牧区之间的距离是欧几里得距离. 3.牧场的 ...

  2. mybatis全局配置文件

    一.properties:引入外部配置文件 1.resource :引入类路径下的全局配置文件,例如:<properties resource="conf/dbconfig.prope ...

  3. MFC中用户自定义类响应自定义消息

    这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义 ...

  4. hdu 1026 Ignatius and the Princess I(BFS+优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1026 Ignatius and the Princess I Time Limit: 2000/100 ...

  5. [转]:理解 Linux 配置文件

    简介: 本文说明了 Linux 系统的配置文件,在多用户.多任务环境中,配置文件控制用户权限.系统应用程序.守护进程.服务和其它管理任务.这些任务包括管理用户帐号.分配磁盘配 额.管理电子邮件和新闻组 ...

  6. HP-UNIX平台修改Oracle processes参数报错:ORA-27154、ORA-27300、ORA-27301、ORA-27302

    OS 版本     :HP-UX B.11.31Oracle版本:11.2.0.4 (RAC) (一)问题描述 最近发现无法连接上数据库,报错信息为“ORA-00020:maximum number ...

  7. delect 删除

    delete ---整表数据删除 (慎用) delete  * from 表名; ---条件删除 delete  * from  表名  where  限制条件;

  8. Spring入门第二课:Spring配置Bean的细节

    1.配置bean的作用域: 通过配置scope属性可以bean的作用域,参数有 prototype.request.session.singleton. 1)singleton为单例,IoC容器只会创 ...

  9. iOS小知识点

    1.子视图超出frame的部分不显示  view.clipsToBounds 设置为YES;   UIScrollview的clipsToBounds默认就是YES 2.UIImage 有一个属性叫s ...

  10. 通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学

    首发于:Aardio通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=429 ...