[补题记录] Codeforces Round 906 (Div. 2)(A~D)

news2024/11/25 16:20:40

URL:https://codeforces.com/contest/1890

目录

A

Problem/题意

Thought/思路

Code/代码

B

Problem/题意

Thought/思路

Code/代码

C

Problem/题意

Thought/思路

Code/代码

D

Problem/题意

Thought/思路

Code/代码


A

Problem/题意

给出一个数组 A,你可以将它任意排列,问是否能使得 

A_i + A_{i+1}=A_{i+1}+A_{I+2}=K

Thought/思路

化简题目给的要求,我们可以发现:

  • a1 = a3、a3 = a5;
  • a2 = a4、a4 = a6;

因此只要有第三种数出现,肯定不对。

两种数的数量不等,也不对。

特别要注意,只有一种数则直接正确。

Code/代码

#include "bits/stdc++.h"

int n, a[107];

void solve() {
	std::cin >> n;
	std::set <int> num;
	std::map <int, int> cnt;
	bool flag = true;
	for (int i = 1; i <= n; ++ i) {
		std::cin >> a[i];
		num.insert(a[i]);
		if (num.size() > 2) {
			flag = false;
		} else {
			cnt[a[i]] ++;
		}
	}

	if (num.size() == 1) {
		std::cout << "Yes\n";
		return;
	}

	if (flag) {
		int a = *num.begin(); num.erase(a);
		int b = *num.begin();
		if (n % 2 == 1) {
			if (std::abs(cnt[a] - cnt[b]) == 1) {
				std::cout << "Yes\n";
			} else {
				std::cout << "No\n";
			}
		} else {
			if (cnt[a] == cnt[b]) {
				std::cout << "Yes\n";
			} else {
				std::cout << "No\n";
			}
		}
		
	} else {
		std::cout << "No\n";
	}
}

signed main() {
	int t; std::cin >> t;
	while (t--) {
		solve();
	}
}

B

Problem/题意

给出 2 个 01 字符串 S、T。当字符串满足 S_i \neq S_{i+1},则这个字符串为 good。

你可以将 T 插入 S 的任意位置(也可以不插),问能否使得 S 为 good。

Thought/思路

如果 S 是 good,直接输出答案 YES。

如果 S 不是 good,那么 T 必须要为 good,否则直接输出答案 NO。

当 S 不是 good 时,说明遇到了  S_i = S_{i+1} = 0/1,此时:

  • 如果 Si = 0,那么 T 必须要满足头尾都是 1;
  • 如果 Si = 1,那么 T 必须要满足头尾都是 0;

所以可以得出:

  • 若 T 头尾不相同,直接输出答案 NO;
  • 若需要插入时,Si != T[0],直接输出答案 NO;

经过以上判断后,则输出 YES。

Code/代码

#include "bits/stdc++.h"

int n, m;
std::string s, t;

void solve() {
	std::cin >> n >> m;
	std::cin >> s >> t;

	bool flag = true;
	for (int i = 0; i <= n - 2; ++ i) {
		if (s[i] == s[i + 1]) {
			flag = false;
		}
	}
	if (flag) {
		std::cout << "YES\n";
		return;
	}

	for (int i = 0; i <= m - 2; ++ i) {
		if (t[i] == t[i + 1]) {
			std::cout << "NO\n";
			return;
		}
	}

	if (t[0] != t[m - 1]) {
		std::cout << "NO\n";
		return;
	}

	for (int i = 0; i <= n - 2; ++ i) {
		if (s[i] == s[i + 1]) {
			if (s[i] == t[0]) {
				std::cout << "NO\n";
				return;
			}
		}
	}

	std::cout << "YES\n";
} 

signed main() {
	int t; std::cin >> t;
	while (t --) {
		solve();
	}
} 

C

Problem/题意

给出 1 个 01 字符串 S。当字符串满足 S_i \neq S_{n - i + 1},则这个字符串为 good。

你可以将 "01" 插入 S 的任意位置(也可以不插),位置可以从 0 开始。

问能否使得 S 为 good。

若能,输出插入序列,若不能,输出 -1。

Thought/思路

因为要求对称位置不相等,所以 n 为奇数时,直接输出 -1。

因为每次插入的是 01,因此若一开始 01 数量不相等,直接输出 -1。

考虑到,若当前 i 之前的位置,都已经与对称位置不同,那么在 [i, n - i + 1] 中任意位置插入,都不会对前面的插入有影响,因此我们直接 L、R 双指针判断即可。

当对称位相等时,说明需要插入 01,此时有:

  • 若 S[L] = 1,说明必须将 01 插入到 L 的左边;
  • 若 S[L] = 0,说明必须将 01 插入到 R 的右边;

插入后就是移动 L、R,以及拼接新字符串了,可以自己想一下。

Code/代码

#include "bits/stdc++.h"

int n;
std::string s;

void solve() {
	std::cin >> n >> s;
	s = "#" + s;

	if (n % 2 == 1) {
		std::cout << -1 << "\n";
		return;
	}

	std::map <int, int> cnt;
	for (int i = 1; i <= n; ++ i) {
		cnt[s[i] - '0'] ++;
	}

	if (cnt[0] != cnt[1]) {
		std::cout << -1 << "\n";
		return;
	}

	std::vector <int> ans;
	int l = 1, r = n;
	while (l + 1 != r) {
		if (s[l] == s[r]) {
			if (s[l] == '1') {
				ans.push_back(l - 1);
				std::string a = s.substr(1, l - 1);
				std::string b = s.substr(l, n - l + 1);
				//std::cout << "a=" << a << " b=" << b << " ";
				s = "#" + a + "01" + b;
				l ++;
				r += 2; r --;
			}
			else if (s[l] == '0') {
				ans.push_back(r);
				std::string a = s.substr(1, r);
				std::string b = s.substr(r + 1, n - (r + 1) + 1);
				//std::cout << "a=" << a << " b=" << b << " ";
				s = "#" + a + "01" + b;
				r += 2; r --;
				l ++;
			}
			n += 2;
		} else {
			l ++;
			r --;
		}
		//std::cout << "l=" << l << " r=" << r << " s=" << s << "\n";
	}
	std::cout << ans.size() << "\n";
	for (auto x : ans) std::cout << x << " ";
	std::cout << "\n";
}

signed main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0); std::cout.tie(0);
	int t; std::cin >> t;
	while (t --) solve();
}

D

Problem/题意

一个国家有 N 个城市,每个城市有 Ai 人,现在要为这个国家修路,当我们想连接城市 i 和城市 j 时,有一个整数 C,需要满足:

  • 令城市 i 和它已经连通的城市,总人口为 Si;
  • 令城市 j 和它已经连通的城市,总人口为 Sj;
  • 当 Si + Sj >= i * j * C 时,则可以在 i 和 j 之间修路;

问能否将 N 个城市连通。 

Thought/思路

很容易想到,当我们使用城市 1 去连接其他城市时,更加容易成功。

需要考虑的是:怎么知道用 1 连接完它能连接的城市后,就已经是最大能连接的数量了。


假设现在有城市 X、Y,它们之间可以连接,则有:

A_X + A_Y \geqslant X * Y *C

若它们不能与城市 1 连接,则有:

A_X + A_1 < X*C

A_Y + A_1 < Y*C

将三条不等式整合,可得:

A_X +A_Y+ 2*A_1 < C*(X+Y)

↓ 

X*Y*C+ 2*A_1 < C*(X+Y)

↓ 

X*Y+ \frac{2*A_1}{C} < X+Y

但是 X、Y 显然是大于 1 的,该不等式不成立。

因此 X、Y 若能连接,则它们一定可以和城市 1 相连。


回到我们最开始的想法:使用城市 1 去连接其他城市时,更加容易连接成功。因此我们可以使用 i * C - A[i] 升序排序,排在前面的更容易与 1 相连。

假设此时 1 已经连接了一些城市,遇到一个城市 M,若 1 不能与城市 M 相连,那么就一定失败了,因为:

  • 若 M 都不能与 1 相连,那 M 后面的城市也一定不能与 1 相连;
  • 既然 M 后面的城市连 1 都连不上,那么肯定也连不上 1 已经连上的城市;

这也是可以证明的,根据上面的条件,假设 M 不能与 1 相连,N 为 M 后的城市,则有:

M < N

A_M + A_1 < M * C

N*C-A_N\geq M*C-A_M

最后得出:

A_N + A_1 < A_N +M*C-A_M

A_N+A_1< A_N + N*C-A_N

A_N+A_1< N*C

Code/代码

#include "bits/stdc++.h"

#define int long long

struct node {
	int id, v;
	bool operator < (const node &t) const {
		return v < t.v;
	}
};

int n, c, a[200007];

void solve() {
	std::cin >> n >> c;

	std::vector <node> s(n + 1);
	for (int i = 1; i <= n; ++ i) {
		std::cin >> a[i];
		s[i] = {i, i * c - a[i]};
	}

	std::sort(s.begin() + 2, s.end());

	int sum = a[1];
	bool flag = true;
	for (int i = 2; i <= n; ++ i) {
		int id = s[i].id;
		sum += a[id];
		if (sum < id * c) flag = false;
	}	

	if (flag) std::cout << "YES\n";
	else std::cout << "NO\n";
}

signed main() {
	int t; std::cin >> t;
	while (t --) solve();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基带开发】AD9361 Accumulator 累加器的用法

IP 核 acc_2048 累加多少个数据&#xff0c;计算方法&#xff1a;23-1211&#xff0c;2^11 2048 IP 使用 acc_2048 ACC1 (.B(12d1 ), // input [11 : 0] b.CLK(ad9361_l_clk ), // input clk.CE(1b1 ), // input ce.BYPASS(clk_gens1…

雪花算法:分布式ID生成的优雅解决方案(建议收藏)

在分布式系统中&#xff0c;唯一ID的生成和管理是一项重要而棘手的任务。雪花算法&#xff0c;由Twitter开源的一种分布式ID生成算法&#xff0c;为这个问题提供了一种优雅的解决方案。本文将详细介绍雪花算法的原理、设计和实现&#xff0c;并通过示例代码和图片帮助读者更好地…

Asterisk Ubuntu 安装

更新环境 sudo apt update sudo apt install wget build-essential git autoconf subversion pkg-config libtool sudo contrib/scripts/get_mp3_source.sh A addons/mp3 A addons/mp3/common.c A addons/mp3/huffman.h A addons/mp3/tabinit.c A addons/mp3/Ma…

竞赛选题 深度学习大数据物流平台 python

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…

TSN工业交换机惊艳亮相第十九届安博会,光路科技展示TSN技术的实际应用

光路科技在第十九届中国国际社会公共安全博览会&#xff08;CPSE安博会&#xff09;上大放异彩&#xff0c;赢得了全球观众的广泛关注。作为展示先进技术和创新解决方案的杰出平台&#xff0c;光路科技无疑成为了此次博览会的焦点之一。 2023CPSE安博会光路科技TSN交换机惊艳亮…

新品发布:信驰达TI CC1352P7双频段多协议模块RF-TI1352P2,支持Matter over Thread

近日&#xff0c;领先的无线物联网通信模块厂商深圳市信驰达科技推出了基于TI CC1352P7 为核心的双频段&#xff08;Sub-1 GHz 和 2.4 GHz&#xff09;多协议无线模块RF-TI1352P2。 RF-TI1352P2模块除了集成负责应用逻辑的高性能 48 MHz ARM Cortex- M4F 主处理器与一个专用于…

AI:48-基于卷积神经网络的气象图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

gcc在线升级

提示&#xff1a;本文在线升级需要服务器连接网络 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技…

第5天:基础入门-资产架构amp;端口amp;应用amp;CDNamp;WAFamp;站库分离amp;负载均衡

第5天&#xff1a;基础入门-资产架构&端口&应用&CDN&WAF&站库分离&负载均衡 #知识点&#xff1a;1. 资产架构-端口&目录&插件接口&多站点&多应用 2. 番外安全-域名&服务器本身&服务厂商&管理人员 3. 考虑阻碍-站库分离&am…

【flink】Task 故障恢复详解以及各重启策略适用场景说明

文章目录 一. 重启策略种类&#xff08;Restart Strategies&#xff09;1. Fixed Delay Restart Strategy2. Failure Rate Restart Strategy3. Fallback Restart Strategy4. No Restart Strategy 二. 故障恢复策略&#xff08;Failover Strategies&#xff09;1. &#xff08;全…

Pycharm 关闭项目卡住

1、升级到最新版本 2、清理缓存 全部勾上 3、修改本地索引 设置找到下面这个&#xff0c;改为&#xff1a;不下载&#xff0c;使用本地索引 4、有人说是和插件有关 pycharm v2023.1.2&#xff0c;我是清理缓存加本地索引解决的&#xff0c;之前 Pycharm 弹了一个窗&#xff0…

佳能R6 m2没有样本文件时的设置方法

佳能R6 m2使用了新的DEC标识和小块长度&#xff0c;一般情况下建议使用加载样本的方式进行处理&#xff0c;如果没有样本也可以使用以下方法。 适用程序:CHS零壹视频恢复程序标准版/专业版/高级版/佳能版 解决问题: 底层原始文件会识别出错&#xff0c;导致很多个小碎片。 …

学习笔记三十三:准入控制

ResourceQuota准入控制器 ResourceQuota准入控制器限制cpu、内存、pod、deployment数量限制存储空间大小 LimitRanger准入控制器在limit名称空间创建pod&#xff0c;不指定资源&#xff0c;看看是否会被limitrange规则自动附加其资源限制创建pod&#xff0c;指定cpu请求是100m&…

『Linux升级路』基础开发工具——yum篇

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Linux下安装软件的方案 &#x1f4d2;1.1源代码安装 &#x1f4d2;1.2r…

【基于HTML5的网页设计及应用】——实现个人简历表格和伪类选择器应用

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

外汇天眼:MAS下令星展银行暂停六个月的非必要活动

新加坡金融管理局&#xff08;MAS&#xff09;已经决定对星展银行有限公司&#xff08;DBS Bank Ltd&#xff09;的非必要IT变更进行为期六个月的暂停&#xff0c;以确保银行集中精力恢复其数字银行服务的弹性。在此期间&#xff0c;星展银行将不被允许开展新的业务&#xff0c…

Nginx代理转发请求POST变GET请求问题

&#x1f680; 注重版权&#xff0c;转载请注明原作者和原文链接 &#x1f96d; 作者&#xff1a;Yuan-Programmer &#x1f34e; 个人博客&#xff1a;https://boke.open-yuan.com &#x1f349; 已经替换了新的域名&#xff0c;总站叫做&#xff1a;OpenYuan开袁网&#xff0…

滤波器及其离散化

原理介绍 令 A aT 一阶低通滤波器&#xff08;离散化&#xff09; - 知乎 (zhihu.com) 【精选】低通滤波器总结_低通滤波器 计算公式 离散_奇妙水果的博客-CSDN博客 MATLAB数值仿真FOC矢量控制_matlab foc模型_奇妙水果的博客-CSDN博客

03、移动零:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

文章目录 1、题目描述1.1 移动所有零至数组末尾1.2 示例 2、解题思路2.1 思路讲解2.2 动画演示&#xff08; 待补充&#xff09;2.3 复杂度分析 3、答案3.1 Java 代码3.2 运行结果 4、视频讲解&#xff08; 待补充&#xff09; 1、题目描述 1.1 移动所有零至数组末尾 给定一个…

nodelist 与 HTMLCollection 的区别

原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准&#xff0c;HTML 文档中的所有内容都是节点&#xff1a; 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…