传送门

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. PHP 中的 curl 函数发送 Post 请求应该注意的几点

    public function http_request( $url, $post = '', $timeout = 5 ){ if( empty( $url ) ){return ;}$ch = c ...

  2. Windows10 +Ubuntu 18.04双系统安装详细教程

    前言: 由于开发需要,很多用户需要安装Linux环境.如果用虚拟机操作会消耗大量内存,一般的电脑会显得卡顿,从而影响开发效率.这里分享一些安装经验,希望能够帮助大家. 教程: 步骤1:下载镜像文件 从 ...

  3. noip考前模板复习

    网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...

  4. jQuery第3天

    复习 如何区别 JS DOM对象和 JQ 包装对象? JQ对象其实是经过包装的DOM对象,包装后可调用 JQ 的方法. JS 对象基本上都是属性为主,JQ基本上都方法为主. 可通过 console.d ...

  5. Django Rest Framework Serializer的简单使用

    1.RESTful 1.1 定义 REST(Representational State Transfer)与技术无关,代表一种软件架构风格,中文为表征状态转移. 1.2 RESTful API设计 ...

  6. CS第三方控件 标签: 总结 2016-04-09 11:51 1398人阅读 评论(27) 收藏

    大家都知道,我现在在做CS的项目,现在是需求频变啊,心里好苦,做了这么久,还是涨了一点点见识的,下面就介绍一下自己最近用到的几款CS的第三方控件. DockPanel 想必大家都用过VS,那么想一下V ...

  7. H5+ 分享到微信、朋友圈代码示例

    h5+分享到微信.朋友圈代码示例 在使用分享功能的时候会莫名的分享失败,debug时发现是图片过大的问题. 图片过大时ios平台上返回错误码-8,安卓上返回错误码-3(我测试是这样) 因此如果第一次分 ...

  8. Android7.0 添加快速设定Quick Settings Tile

    Android7.0新推出了一个非常实用的功能--添加快速设定(或者翻译成快速设置),但是感觉社区里关注的人比较少,可能目前为止国内还没有Android7.0的手机,但是越早接触越好,甚至可以告诉产品 ...

  9. 巨蟒python全栈开发-第11阶段 ansible3_3入门playbook剧本

    1.playbook剧本 2.playbook传参 3.setup模块介绍 4.playbook的tags 5.playbook的handlers&&templates模块 6.条件和 ...

  10. AcWing95. 费解的开关 枚举+位运算

    这道题的确比较难想,首先我们知道图比较小,有可能是枚举,那么该如何枚举呢??? 你可以发现,我们只要把第一排定了,并且保证第一排不准动,那么答案就定了 也就是说,我们首先用二进制枚举,枚举第一行需要翻 ...