思维训练3

题目描述1

Problem - A - Codeforces

题目分析

样例1解释:

对于此题,我们采用贪心的想法,从1到n块数越少越好,故刚好符合最少的块数即可,由于第1块与第n块是我们必须要走的路,所以我们可以根据这两块砖的颜色进行分类判断。

如果这两块砖是一样的颜色,我们只需要判断这两块砖算上中间的颜色的总块数是否>=k即可。

如果这两块砖是不一样的颜色,我们需要分别从两端观察前面这部分的砖和后面这部分砖可以走的相同的颜色是否>=k即可

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
void solve()
{
	int n, k, c[N];
	cin >> n >> k;
	for(int i = 1; i <= n; i ++)cin >> c[i];
	if(c[1] == c[n])
	{
		int cnt = 0;
		for(int i = 2; i <= n - 1; i ++)
		{
			if(c[i] == c[1])cnt ++;	
		}
		if(cnt >= k - 2)cout << "YES" << '\n';
		else cout << "NO" << '\n';
	}
	else 
	{
		int l = n, r = 1,kl = 0, kr = 0;
		for(int i = 1; i <= n && kl < k; i ++)
		{
			if(c[i] == c[1])
			{
				kl ++;
				l = i;
			}
		}
		for(int i = n; i >= 1 && kr < k; i --)
		{
			if(c[i] == c[n])
			{
				kr ++;
				r = i;
			}
		}
		if(kl == k && kr == k && l < r)cout << "YES" << '\n';
		else cout << "NO" << '\n'; 
	}
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

题目描述2

Problem - B - Codeforces

题目样例示意:

注意:找出的是排列也就是说数字不能重复,而且所有的数从小到大排序之后一定为连续的。

思考:什么是好区间?

包含1但是不包含2的区间(2)

包含1,2但是不包含3的区间(3)

包含1,3但是不包含2的区间(2)

为了使这样的区间尽可能多

我们可以进行一个构造,题目要求在所有的区间中尽量使所有的素数结果最多我们可以将2和3放在两边,将1放在中间,这样中间的大部分经过了1,但是未到达两边的2,3区间都是有贡献的,或者经过了1,2,但是没经过3的也是有贡献的,或者经过了1,3但是没经过2的也有贡献。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N], n;
void solve()
{
	cin >> n;
	a[1] = 3, a[n] = 2;
	int x = (n + 1) / 2;
	a[x] = 1;
	int k = 3;
	for(int i = 2; i < x; i ++)
	{
		k ++;
		a[i] = k;	
	} 
	for(int i = x + 1; i < n; i ++)
	{
		k ++;
		a[i] = k;
	}
	for(int i = 1; i <= n; i ++)cout << a[i] << ' ';
	cout << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

题目描述3 

Problem - C - Codeforces

题目分析

此题我们需要掌握缩点的思想。

缩点:连续相同的字符变成一个字符即可

eg.00011110001011缩点成010101

需要不降序排列故左边0多好,"?"挨着哪个数就缩成哪个数,如果左右两边的数不一样就统一先按左边来缩数

#include<bits/stdc++.h>
using namespace std;
void solve()
{
	string s ;
	cin >> s;
	int n = s.size() ;
	for(int i = 0; i < n; i ++)
	{
		if(i != 0 && s[i] == '?')
		{
			s[i] = s[i - 1];		
		}	
		else if(i == 0 && s[i] == '?')s[i] = '0';
	}		
	cout << s << '\n';
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

题目描述4

Problem - D - Codeforces

题目分析 

由上图可知变化一次必然会进行一次颜色的翻转

R表示数字不同的一列,B表示数字相同的一列

故要么是全R要么是全B才能到达一个全B的终点

一次操作到全R两次操作就会回到全B,故我们需要进行操作绑定

两两配对操作会使得除了这两个数之外的所有数都不发生变化(操作绑定)

但是如果剩下一个数没有配对时,可以进行如图右下角的方法计算

将需要改变的1存入vector中,并将其中的不能配对的奇数的1单独取出计算,剩下的进行配对即可

注:若取出的数的位置不在1时就可以改变(1, x - 1),(1, x)

若取出的数的位置在1时就可以改变(x, n)(x + 1, n)

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
typedef pair<int, int> PII; 
void solve()
{
	char a[N], b[N];
	int n;
	vector<PII> ans;
	vector<int> pos;
	cin >> n;
	cin >> a + 1 >> b + 1;
	bool flag1 = 0, flag2 = 0;
	for(int i = 1; i <= n; i ++)
	{
		if(a[i] == b[i])flag1 = 1;
		else flag2 = 1;
	}
	if(flag1 && flag2)
	{
		cout << "NO" << '\n';
		return;
	}
	if(flag2)//如果全是不相同的字符
	{
		ans.push_back({1, n});
		for(int i = 1; i <= n; i ++)
		{
			if(a[i] == '0')a[i] = '1';
			else a[i] = '0';
		}
	}
	for(int i = 1; i <= n; i ++)
	{
		if(a[i] == '1')pos.push_back(i);
	}
	if(pos.size() & 1)
	{
		int x = pos.back();
		if(x == 1)
		{
			ans.push_back({x, n});
			ans.push_back({x + 1, n});
		}
		else
		{
			ans.push_back({1, x - 1});
			ans.push_back({1, x});
		}
		pos.pop_back();
	}
	for(auto i : pos)ans.push_back({i, i});
	cout << "YES" << '\n' << ans.size() << '\n';
	for(auto i : ans)
	{
		cout << i.first << ' ' << i.second << '\n';	
	} 
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

题目描述5

Problem - E - Codeforces

题目分析

此题相当于找规律,从最大的数开始看起,第一个大于等于(n - 1)的平方数就是此处可以组成的平方数,发现会有连续的一段的平方数一样,判断限制条件,如果条件不满足就循环改数使其满足条件。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
void solve()
{
	bitset<N> vis;
	int n;
	cin >> n;
	int y = 0;
	while(y * y < n - 1)y ++;
	for(int i = n - 1; i >= 0; i --)
	{
		while(y * y - i >= n || vis[y * y - i])y --;
		a[i] = y * y - i;
		vis[a[i]] = true;
	}
	for(int i = 0; i < n; i ++)
	{
		cout << a[i] << ' ';
	}
	cout << '\n';
}
int main()
{
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/114833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++--二叉搜索树初阶

前言&#xff1a;二叉搜索树是一种常用的数据结构&#xff0c;支持快速的查找、插入、删除操作&#xff0c;C中map和set的特性也是以二叉搜索树作为铺垫来实现的&#xff0c;而二叉搜索树也是一种树形结构&#xff0c;所以&#xff0c;在学习map和set之前&#xff0c;我们先来学…

鸿运主动安全云平台任意文件下载漏洞复习

简介 深圳市强鸿电子有限公司鸿运主动安全监控云平台网页存在任意文件下载漏洞&#xff0c;攻击者可通过此漏洞下载网站配置文件等获得登录账号密码 漏洞复现 FOFA语法&#xff1a;body"./open/webApi.html" 获取网站数据库配置文件 POC&#xff1a;/808gps/Mobile…

Android Studio中配置Git

安装Git 在安装Android Studio之前&#xff0c;需要先安装Git。可以从Git官网下载并安装Git&#xff1a;https://git-scm.com/downloads 在Android Studio中配置Git 在Android Studio中&#xff0c;依次点击“File” -> “Settings”&#xff0c;在弹出的窗口中选择“Ver…

vue学习part01

02_Vue简介_哔哩哔哩_bilibili Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 1.简介 2.常用用法 新项目一般vue3&#xff0c;老项目vue2 3.vue两种风格&#xff1a;选项式api&#xff08;vue2&#xff09;和组合式api&#xff08;vue3&#xff09; 两种方式实现累…

财务数字化转型的切入点是什么?_光点科技

随着科技的不断进步&#xff0c;数字化转型已经成为各个行业追求的目标&#xff0c;财务领域也不例外。那么&#xff0c;财务数字化转型的切入点在哪里呢&#xff1f;如何确保转型的成功进行&#xff1f; 数据整合与管理 财务数据的准确性与及时性是财务管理的基石。数字化转型…

桥和割点,以及图的遍历树

目录 什么是桥 寻找桥的算法 代码实现 什么是割点 ​寻找割点的算法 代码实现 什么是桥 寻找桥的算法 代码实现 import java.util.ArrayList;public class FindBridges {private Graph G;private boolean[] visited;private int ord[];private int low[];private int cnt…

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

背景介绍 随着大数据技术的进步&#xff0c;企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法&#xff0c;有助于理解数据如何被转换和消费&#xff0c;同时对数据治理和合规性起到关…

阿里云的OSS云存储的基本使用

阿里云官网&#xff1a;阿里云-计算&#xff0c;为了无法计算的价值 通过阿里云官网&#xff0c;登录进入用户的界面&#xff0c;在搜索框中输入OSS&#xff0c;然后进入阿里云的对象存储OSS的控制台。&#xff08;未开通的开通即可&#xff09; 创建 Bucket 点击【Bucket 列…

OpenShift - 利用容器的特权配置实现对OpenShift攻击

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.13 的环境中验证 本文是《容器安全 - 利用容器的特权配置实现对Kubernetes攻击》的后续篇&#xff0c;来介绍 在 OpenShift 环境中的容器特权配置和攻击过程和 Kubernetes 环境的差异。 文…

JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

目录 1.加载阶段2.连接阶段1.验证2.准备3.解析 3.初始化阶段4.总结 类的生命周期 1.加载阶段 ⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道。 ⚫ 2、类加载器在加载完类…

14.Eclipse全局查找字符,类,方法快捷键

eclipse开发中&#xff0c;查找会是一个经常用到的功能所以总结一下 1&#xff0c;查找一个类 Shift Ctrl h 或者 Shift Ctrl r 这种方式能快速的定位接口&#xff0c;类还有注解在那个包里面 2.综合查找 Ctrl H 这是一种综合查找 &#xff0c;可以用来查找 一个方法的…

selenium爬虫——以爬取澎湃新闻某搜索结果为例

文章目录 selenium爬虫——以爬取澎湃新闻某搜索结果为例前言需要导入的包需要避雷的点webdriver的版本要与浏览器一致如果使用爬虫打开了新网页&#xff0c;要记得跳转XPath和selector都可以直接复制爬取多网页时记得try打入word时调整字体的问题 完整程序扩展爬取效果 seleni…

【蓝桥杯】2023省赛H题

考察知识点&#xff1a;双向链表&#xff0c;小根堆 完整代码在文章末尾 题目 【问题描述】 给定一个长度为 N 的整数数列: A1,A2,...,AN。你要重复以下操作 K 次 :…

利用云计算和微服务架构开发可扩展的同城外卖APP

如今&#xff0c;同城外卖APP已经成为了人们点餐的主要方式之一。然而&#xff0c;要构建一款成功的同城外卖APP&#xff0c;不仅需要满足用户的需求&#xff0c;还需要具备可扩展性&#xff0c;以适应快速增长的用户和订单量。 一、了解同城外卖APP的需求 在着手开发同城外卖…

Doris:StreamLoad导入数据

目录 1.基本原理 2.支持数据格式 3.StreamLoad语法 3.1.请求参数 3.2.返回参数 4.StreamLoad实践 4.1.使用 curl命令 4.2.使用Java代码 Stream load 是一个同步的导入方式&#xff0c;用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 主…

Git(七).git 文件夹瘦身,GitLab 永久删除文件

目录 一、问题背景二、问题复现2.1 新建项目2.2 上传大文件2.3 上传结果 三、解决方案3.1 GitLab备份与还原1&#xff09;备份2&#xff09;还原 3.2 删除方式一&#xff1a;git filter-repo 命令【推荐】1&#xff09;安装2&#xff09;删除本地仓库文件3&#xff09;重新关联…

深度学习实战:基于TensorFlow与OpenCV的手语识别系统

文章目录 写在前面基于TensorFlow与OpenCV的手语识别系统安装环境一、导入工具库二、导入数据集三、数据预处理四、训练模型基于CNN基于LeNet5基于ResNet50 五、模型预测基于OpenCV 写在后面 写在前面 本期内容&#xff1a;基于TensorFlow与OpenCV的手语识别系统 实验环境&…

333333333333

一、Map 接口 接下来讲的都是基于 jdk8 来开展的。 1.1 特点 1、Map 与 Collection 并列存在。Map 是用于保存具有映射关系的数据&#xff0c;即 key-value。 2、Map 中的 key 和 value 可以是任何引用类型的数据类型。 3、Map 中的 key 不允许重复&#xff0c;原因和 HashSet…

动态路由协议OSPF项目部署(二)

1. 静态和动态路由的区别&#xff1b; 2. OSPF协议通信过程与部署&#xff1b; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的&#xff1f; - 依靠手动 或…