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 ...
随机推荐
- VirtualBox安装,VirtualBox安装CentOS
1.进入VirtualBox官网下载页,找到对应的版本 https://www.virtualbox.org/wiki/Downloads 按步骤安装好 2.进入CentOS官网下载页,找到对应的版本 ...
- vs dump调试
1. dump文件和pdb文件的匹配问题 >> 发布二进制文件时生成的pdb文件一定要保留,只有当发布的二进制文件和pdb文件是同时生成的才好正确调试. 2. dump文件和pdb文件放在 ...
- LintCode刷题笔记-- Count1 binary
标签: 位运算 描述: Count how many 1 in binary representation of a 32-bit integer. 解题思路: 统计一个int型的数的二进制表现形式中 ...
- IDEA(JAVA)使用json
首先介绍一下json SON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的 ...
- php 如何生成静态页
PHP文件名:dome.php <?php $string = 1; ob_start(); @readfile("templets/list.html"); $text = ...
- laravel 图片上传 intervention/image
1. composer require intervention/image 2). 修改 app/config/app.php 添加 ServiceProvider: // 将下面代码添加到 pro ...
- MSSQL 为db创建user
use [IBatisNet]GO if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')B ...
- js函数易犯的错误
1.定义一个js函数时不能写在另一个函数里面. 2.定义一个打开网页自动执行的函数,一定要注意加载的顺序.如果是不是自动执行的,而是等页面加载完后事件触发的,那写在任何地方都没问题. 错误的:
- [React Native]升级React Native版本
React Native正式版本还没发布,但是小版本基本上每个月都更新1-2次.9月11号又更新了0.33版本,其中有两个增强功能正好是项目中用到的. 添加Android6.0权限验证API Add ...
- 如何手动解析CrashLog
http://www.cocoachina.com/ios/20150803/12806.html 解决崩溃问题是移动应用开发者最日常的工作之一.如果是开发过程中遇到的崩溃,可以根据重现步骤调试,但线 ...
