传送门

F.Black&White

题意

  操作 m 次后,求连续的1或连续的0的最大值,每次操作只能反转一个位置;

思路1(反悔操作)

  定义队列q:依次存放两个零之间的1的个数+1;

  首先求解1最大的连续值;

  假设 n=15 , m=3 , s如下图所示;

  

  ①来到第一个0位置,m=3>0,反转,m--,q.push(3),cnt=3;

  ②来到第二个0位置,m=2>0,反转,m--,q.push(2),cnt=5;

  ③来到第三个0位置,m=1>0,反转,m--,q.push(1),cnt=6;

  ④来到第四个0位置,m=0,没法反转这个0,需要删除前面的一次操作来反转当前的位置;

     删除哪个操作呢?

     当然是最早的那次操作了,即将第一个零位置反转回0,并将当前位置反转;

     将第一个0位置反转回0后,图示紫圈①对答案就没有贡献了,需要删掉 cnt=6-3=3;

     q.push(3),cnt=6;

  其余同理;

  综上:

  ①m > 0,直接进行反转操作,并记录将此位置反转后,此位置与其前一个零之间的连续的1的个数;

  ②m = 0,反悔操作,将最早的一次反转操作删除,反转此位置,并记录;

  求解连续的 0 位置,只需将 s 中的 0,1 互换,然后在跑一边上述代码即可;

  输出两者的最大值;

AC代码

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+; int n,m;
char s[maxn]; queue<int >q;
int F()///将0变成1的最大长度
{
while(!q.empty())
q.pop(); int cnt=;
int pre=;
int ans=;
int cur=m;
for(int i=;i <= n;++i)
{
if(s[i] == '')
cnt++;
else if(cur > )
{
cur--;
cnt++;
q.push(cnt-pre);///cnt-pre:两个0之间的1的个数+1
pre=cnt;
}
else if(!q.empty())///反悔操作
{
int tmp=q.front();
q.pop();
cnt -= tmp;
pre -= tmp;
cnt++;
q.push(cnt-pre);
pre=cnt;
}
else
cnt=;
ans=max(ans,cnt);
}
return ans;
}
int Solve()
{
int ans=F();
for(int i=;i <= n;++i)///0,1互换,重用F()
s[i]=s[i] == '' ? '':'';
ans=max(ans,F());
return ans;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
int test;
scanf("%d",&test);
while(test--)
{
scanf("%d%d",&n,&m);
scanf("%s",s+);
printf("%d\n",Solve());
}
return ;
}

思路2(暴力)

  枚举每个位置,判断从以当前位置为开始,经过 m 次操作最长的连续的 1 的个数;

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+; int n,m;
char s[maxn]; int F()
{
int ans=;
int e=;
int cur=m;
for(int i=;i <= n;++i)
{
e=max(e,i);
while(e <= n)
{
if(s[e] == '')
{
if(cur > )
cur--;
else
break;
}
e++;
}
///以i位置为左端点,经过m次操作,最远到达e-1位置
ans=max(ans,e-i);
if(s[i] == '')
cur=min(,m);
}
return ans;
}
int Solve()
{
int ans=F();
for(int i=;i <= n;++i)
s[i]=(s[i] == '') ? '':'';
ans=max(ans,F());
return ans;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
int test;
scanf("%d",&test);
while(test--)
{
scanf("%d%d",&n,&m);
scanf("%s",s+);
printf("%d\n",Solve());
}
return ;
}

思路3(二分+前缀和)

待写

2019年湘潭大学程序设计竞赛(重现赛)F.Black&White的更多相关文章

  1. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 F - 打铁的箱子

    题目描述 作为彩虹岛上最擅长打铁的人,

  2. [2019年湘潭大学程序设计竞赛(重现赛)H chat][背包dp]

    链接:https://ac.nowcoder.com/acm/contest/893/H来源:牛客网 题目描述 在Casya生活的世界里,一天由m个小时组成. 最近Casya的女神终于答应在接下来的n ...

  3. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 G - 彩虹岛套娃

    题目描述 俄罗斯套娃是俄罗斯特产的木制玩具,一般由多个一样图案的空心木娃娃一个套一个组成,最多可达十多个,通常为圆柱形,底部平坦可以直立.颜色有红色,蓝色,绿色,紫色等.最普通的图案是一个穿着俄罗斯民 ...

  4. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 H - 圣诞节糖果

    题目描述 圣诞节临近,彩虹岛的黑心商人

  5. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 D - 新卡片游戏

    题目描述

  6. 第十四届浙江财经大学程序设计竞赛重现赛--A-A Sad Story

    链接:https://www.nowcoder.com/acm/contest/89/A 来源:牛客网 1.题目描述 The Great Wall story of Meng Jiangnv’s Bi ...

  7. “浪潮杯”第九届山东省ACM大学生程序设计竞赛重现赛 C-Cities

    题目描述:There are n cities in Byteland, and the ith city has a value ai. The cost of building a bidirec ...

  8. 牛客网 湖南大学2018年第十四届程序设计竞赛重现赛 A game

    链接:https://www.nowcoder.com/acm/contest/125/A来源:牛客网 Tony and Macle are good friends. One day they jo ...

  9. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...

随机推荐

  1. ThinkPHP5.0中的build.php自动生成所需的目录结构的详细方法

    一.来到根目录下,找到bulid.php文件进行改写. 改写方法:保留常用的目录结构,其余按照需求改吧! 二.复制一份build.php文件到application目录下 此时根目录下的bulid.p ...

  2. Hashkell 第一篇

    心情极差.................. 无事可做,其实是没心情去做事情,只好又翻起了haskell入门 记下几点,以备查询: 1. 函数名首字符是不可以大写的, 而且名称中可以有单引号,这也是合 ...

  3. Directx11教程(21) 修正程序最小化异常bug

    原文:Directx11教程(21) 修正程序最小化异常bug       很长时间竟然没有注意到,窗口最小化时候,程序会异常,今天调试水面程序时,随意间最小化了窗口,发现程序异常了.经过调试,原来程 ...

  4. oracle Transactional

    从shutdown transactional命令发布起, 禁止建立任何新的oracle连接. 从shutdown transactional命令发布起,禁止启动任何新的事务. 一旦数据库上所有的活动 ...

  5. More Effective C++: 02操作符

    05:谨慎定义类型转换函数 有两种函数允许编译器进行隐式类型转换:单参数构造函数(single-argument constructors)和隐式类型转换运算符.单参数构造函数是指只用一个参数即可以调 ...

  6. 微服务开源生态报告 No.4

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  7. mysql通过日志恢复数据库

    案例:http://www.linuxidc.com/Linux/2012-11/74005.htm http://blog.csdn.net/ssrc0604hx/article/details/1 ...

  8. UVA_489:Hangman Judge

    Language:C++ 4.8.2 #include<stdio.h> #include<string.h> int main(void) { ]; ]; ]; ]; // ...

  9. Libevent:2设置

    Libevent有一些整个进程共享的全局设置.这些设置会影响到整个的库.因此必须在调用Libevent其他函数之前进行设置,否则,LIbevent就会陷入不一致的状态. 一:Libevent中的日志信 ...

  10. jquery解析XML文件实现的省市联动

    XML我是直接在网上下载的文件包 拿过来用的 jquery我用的是3.1的 前台页面 <form action="buy.html" method="get&quo ...