CF小组训练赛 Holiday 19

news/2024/11/30 20:33:44/

A. Balls of Buma

具体题目地址可以直接搜索题目标题

题目大意

"BBWWBB"代表不同颜色的球,要求往这个不同颜色的球构成的球段的某位置放入一个某种颜色的球,如果放入球后,如果某些相同颜色的球段由于上一个动作而变长,并且其长度至少变为3,则此段的所有球都将被消除。

  • 例如"BBWWBB",放入"BBWWWBB",由于**上一个动作(放入W球)而W颜色的球段变长,且长度>=3,则W颜色的球被消除,球段变成"BBBB",由于上一个动作(消除颜色W的球)**而B颜色球段变长,且长度>=3,则B球被消除

题目求:一共有可以放入一个球然后消除所有球的位置

解题思路

显然根据题目大意,对于每一个满足要求的位置,放入的颜色必然与该位置前后的球段颜色的一种相同,比如"BBWWBB"可以在第三个位置放入W。
针对该满足要求的位置,在放入W球后,W颜色球段的长度必然发生增长且长度>=3,当W球段被消除后,因W球段被消除而引起的球段合并,必然也发生了长度的增长且长度>= 3,然后被消除……迭代直到整个球段被彻底消除。

显然,该位置只可能在球段中间,且从中间往两边游走时,匹配的相同颜色的球段长度之和必然>=3,如"CCBBWW BBCCC"。从而解题思路就是:从两边往内部游走,判断颜色是否相同,如果不相同,则必然无法满足条件;如果颜色相同且序列长度>=3,则该球段目前位置可能被消除,继续下一球段的判定。当颜色相同但序列长度<3时,无法满足条件(因合并动作使长度增加且满足>=3);当且仅当i > j 时,游走结束,此时re = 2 倍的中间序列长度,所以最后结果就是 re / 2 + 1。

"BBWWBB"中间序列是“WW”,初始态:
i=2 j=3 re = 0
BBWWBB
判断完毕:
j=1 i=4 re = 4
BBWWBB
所以,满足要求的位置共有: 4 / 2 + 1 = 3

  • +1是指"WW"存在XWW,WXW,WWX共有“长度+1”个可插入位置
#include<bits/stdc++.h>
using namespace std;
int main(){string a;cin >> a;int re = 0;int i = 0;int j = a.length() - 1;int f = 1;while(i <= j){if(a[i] == a[j]){char x = a[i];while(a[i] == x){i++;re++;}while(a[j] == x){j--;re++;}//cout << i << " " << j << endl;if(re < 3){f = 0;break;}if(i <= j){re = 0;}}else{f = 0;break;}}if(f == 0)cout << "0" << endl; elsecout << (re / 2) + 1 << endl; return 0;
}

B. Blocks

具体题目地址可以直接搜索题目标题

题目大意

类似于翻硬币,针对序列“BWWWWWWB”,每次可以将位置i与位置i+1的硬币反转,即W变成B,B变成W,针对长度为n的序列,最多不可超过3n次,问能不能把所有硬币弄成相同的颜色

解题思路

首先,找规律。显然,当且仅当序列中的W、B的个数至少有一项为偶数时,存在解,否则无解。
为了方便处理,直接选择偶数次的元素处理。这里我们选择B,保证B必然是偶数。

  • 为了保证B的次数必然是偶数:可以发现,在存在解的情况下,存在以下情况:W偶 B奇数、W偶 B偶、W奇 B偶数,当且仅当W是奇数的时候,B必然是偶数,所以,当W是奇数的时候,我们将所有的W和B互相转换,保证处理的“B”必然是偶数。

然后经过偶数次翻转,即翻转所有的B,保证最后的序列必然一致

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(){cin>>n>>s;int ans1=0,ans2=0;for(int i=0;i<s.size();i++)if(s[i]=='B')ans1++;elseans2++; // Wif( (ans1&1) && (ans2&1) ){cout<<-1;return 0;}if(!(ans2&1)) // if W 是偶数次的话 for(int i=0;i<s.size();i++)if(s[i]=='W')s[i]='B';elses[i]='W';queue<int> q;for(int i=0;i<s.size()-1;i++)if(s[i] =='B' ){q.push(i+1);if(s[i+1]=='W')s[i+1]='B';elses[i+1]='W';}cout<<q.size()<<endl;while(!q.empty())cout<<q.front()<<' ',q.pop();return 0;
}

http://www.ppmy.cn/news/622026.html

相关文章

2023-06-25:redis中什么是缓存穿透?该如何解决?

2023-06-25&#xff1a;redis中什么是缓存穿透&#xff1f;该如何解决&#xff1f; 答案2023-06-25&#xff1a; 缓存穿透 缓存穿透指的是查询一个根本不存在的数据&#xff0c;在这种情况下&#xff0c;无论是缓存层还是存储层都无法命中。因此&#xff0c;每次请求都需要访…

cf刷题记录- 5 1

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 TaixInteresting drinkFenceFancy FenceLaptopsMove BracketsOlesya and RodionIQ testRegistration systemVanya and LanternsT-primesCut Ribbon Taix 问你 n个 1 2 3 4 中&#xff0c; 可以组成多少组&#xf…

neovim 键位映射

neovim 键位映射 neovim的键位映射是指将键盘上的一组按键绑定到vim 插件的某一个功能。 7 种模式 官方文档原文&#xff1a; There are seven sets of mappings For Normal mode: When typing commands. For Visual mode: When typing commands while the Visual area is h…

【Spring Cloud Alibaba Seata 处理分布式事务】——每天一点小知识

&#x1f4a7; S p r i n g C l o u d A l i b a b a S e a t a 处理分布式事务 \color{#FF1493}{Spring Cloud Alibaba Seata 处理分布式事务} SpringCloudAlibabaSeata处理分布式事务&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f98…

windows10密钥激活失败 0x80072efe

window10&#xff08;专业版&#xff09;正版密钥激活失败&#xff0c;错误代码&#xff1a;0x80072efe. 首先检查密钥是否输错&#xff0c;在没有输错和网络没有问题的情况下&#xff0c;使用正版光盘里面的激活密钥激活系统&#xff0c;出现激活失败无法激活&#xff0c;有时…

win7激活提示错误代码0x80072EE2的最可行解决办法

很多同学在激活win7旗舰版&#xff0c;专业版和家庭版的时候遇到过提示错误代码0x80072EE2的困难&#xff0c;小编经过几次周折&#xff0c;终于完美解决问题&#xff0c;下面小编就把相关经验为大家分享一下。一&#xff0c;首先保证你的密钥是可用的&#xff0c;如果密钥失效…

软件测试面试题(完整版)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c…

漏洞分析|死磕Jenkins漏洞回显与利用效果

0x01 背景 近期我们发起了一个Goby漏洞挑战赛的活动&#xff0c;在活动期间收到了大量的反馈信息&#xff0c;延伸出一系列在编写POC漏洞检测与利用中考虑场景不全的问题&#xff0c;我们针对发现的各种场景用市面上常见的工具进行了一些列的对比工作&#xff0c;发现市面上工…