题意与分析 (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. springmvc(2)处理器设配器和映射器

     非注解的处理器 映射器 和 适配器 一.处理器映射器 1.BeanNameUrlHandlerMapping <bean class="org.springframework.web ...

  2. 数据库——MySQL——事务

    数据的事务是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行. 事务必须具备四个特性: 原子性 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚 一致性 在事务T开始时, ...

  3. Jstorm+Spring+mybatis整合

    在现有的jstorm框架下,有一个需求:jstorm要对接mysql数据库的实时读取数据, 通过bolt处理,可能要调用service层的框架,最后保存到数据库. 在网上寻找了一下,发现storm集成 ...

  4. Oracle 常用脚本

    ORACLE 默认用户名密码 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMAL 登录,可作为默认的系统管理员 system/manager SYSDB ...

  5. mysql数据库迁移到oracle数据库后 如何删除相同的数据

    mysql数据库迁移到oracle数据库后 如何删除相同的数据 首先搞清楚有多少数据是重复的 select pid from product group by pid having count(pid ...

  6. Linux查看MAC地址方法

    注:一般默认的网卡文件名是eth0,根据IP地址对应的实际情况区判断是ethx即可. 1. ip -a . cat /sys/class/net/ens39/address  其中 HWaddr字段就 ...

  7. IoC和AOP扩展

    一.构造注入 二.使用p命名空间注入属性值 三.注入不同数据类型 <?xml version="1.0" encoding="UTF-8"?> &l ...

  8. 初识Java——第一章 初识Java

    1. 计算机程序: 为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合. 2. JAVA相关的技术:      1).安装和运行在本机上的桌面程序      2).通过浏览器访问的面向 ...

  9. Spring的绿草丛

    Spring 轻量级框架,JavaEE的春天,当前主流框架 “站立式”的企业应用开发框架 目标 实现有的技术更加易用,推进编码最佳实践 内容:loC容器,AOP实现,数据访问支持:简化JDBC/ORM ...

  10. Android中的AutoCompleteTextView(随笔提示文本)组件的简单使用

    Android中的随笔提示文本组件AutoCompleteTextView的使用,此组件用于输入文本,然后就会在所配置的适配器中的数据进行查找显示在组件下面. 这里值得注意的是AutoComplete ...