2019年湘潭大学程序设计竞赛(重现赛)F.Black&White
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的更多相关文章
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 F - 打铁的箱子
题目描述 作为彩虹岛上最擅长打铁的人,
- [2019年湘潭大学程序设计竞赛(重现赛)H chat][背包dp]
链接:https://ac.nowcoder.com/acm/contest/893/H来源:牛客网 题目描述 在Casya生活的世界里,一天由m个小时组成. 最近Casya的女神终于答应在接下来的n ...
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 G - 彩虹岛套娃
题目描述 俄罗斯套娃是俄罗斯特产的木制玩具,一般由多个一样图案的空心木娃娃一个套一个组成,最多可达十多个,通常为圆柱形,底部平坦可以直立.颜色有红色,蓝色,绿色,紫色等.最普通的图案是一个穿着俄罗斯民 ...
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 H - 圣诞节糖果
题目描述 圣诞节临近,彩虹岛的黑心商人
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 D - 新卡片游戏
题目描述
- 第十四届浙江财经大学程序设计竞赛重现赛--A-A Sad Story
链接:https://www.nowcoder.com/acm/contest/89/A 来源:牛客网 1.题目描述 The Great Wall story of Meng Jiangnv’s Bi ...
- “浪潮杯”第九届山东省ACM大学生程序设计竞赛重现赛 C-Cities
题目描述:There are n cities in Byteland, and the ith city has a value ai. The cost of building a bidirec ...
- 牛客网 湖南大学2018年第十四届程序设计竞赛重现赛 A game
链接:https://www.nowcoder.com/acm/contest/125/A来源:牛客网 Tony and Macle are good friends. One day they jo ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it
链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...
随机推荐
- Beetl 3中文文档 转载 http://ibeetl.com/guide/
Beetl作者:李家智(闲大赋) <xiandafu@126.com> 1. 什么是Beetl 广告:闲大赋知识星球,付费会员 Beetl( 发音同Beetle ) 目前版本是3.0.7, ...
- golang进制
- 大数据技术之Oozie
第1章 Oozie简介 Oozie英文翻译为:驯象人.一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache,提供对Hadoop MapReduce.Pig Jobs的任务调度与协 ...
- Python之整数类型
整数:18,73,84 每一个整数都有如下的功能:class int(object): """ int(x=0) -> int or long int(x, bas ...
- 部署zabbix3.2.7,升级到3.4、proxy部署
一.Server安装 可以使用mysql.percona.mariadb等,本例使用mariadb.由于是事后整理,只截取部分命令. #yum install mariadb-server maria ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...
- MySQL的安装问题总结--终极解决方案
MySQL安装 选择:custom 自定义 更改路径 安装到其他盘 选择:launch configuration finish 进行配置 如果忘记选择 找 "E:\Program Fil ...
- iOS 通知观察者的被调函数不一定运行在主线程
Tony in iOS | 08/08/2013 iOS 通知观察者的被调函数不一定运行在主线程 今天修复Bug时候发现的一个小细节,记录下. 问题描述 事情是这样的:我在A视图(UITableVie ...
- 《mysql必知必会》笔记2(子查询、联接、组合查询、全文本搜索)
十四:使用子查询 1:子查询是嵌套在其他查询中的查询. 2:需要列出订购TNT2的所有客户信息,需要下面几步: a:从orderitems表中检索出包含物品TNT2的所有订单号: b:根据上一步得出的 ...
- jquery 即点即改
//在html中建立表单. <table border=""> <th>编号</th> <th>用户名</th> < ...