ABC350A-F题解

ABC350 A-E题解

  • A
    • 题目
    • AC Code(CPP):
    • AC Code(Python):
  • B
    • 题目
    • AC Code(CPP):
    • AC Code(Python):
  • C
    • 题目
    • AC Code(CPP):
    • AC Code(Python)
  • D
    • 题目
    • AC Code(CPP):
    • AC Code(Python):
  • E
    • 题目
    • 时间复杂度分析
    • AC Code(CPP):
    • AC Code(Python):
  • F
    • 题目
    • AC Code(CPP):
    • AC Code(Python):

下面的内容不包括题目翻译,要想获取题目翻译,请参照 这篇教程 来获取题目翻译。

A

题目

只需要判断 S S S 是否在 ABC001ABC349 范围内即可。

可以使用字符串之间的大小关系来快速通过此题。

AC Code(CPP):

#include <iostream>
using namespace std;
string s;
string t = "ABC350";int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> s;if (s < t && s != "ABC316" && s >= "ABC001") {cout << "Yes";}else {cout << "No";}return 0;
}

AC Code(Python):

s = input()
print(('No', 'Yes')[s != 'ABC316' and 'ABC001' <= s <= 'ABC349'])

B

题目

C++ 中,可以通过使用一个布尔数组来判断这颗牙齿是否被拔除。而在 Python 中,可以通过集合实现。如果集合里面有这个元素,说明这颗牙齿被拔掉了,否则,说明这颗牙齿还在。

AC Code(CPP):

#include <iostream>
using namespace std;
int n, q;
bool vis[2010];int main() {cin >> n >> q;while (q--) {int t;cin >> t;if (vis[t]) {n++;vis[t] = 0;}else {n--;vis[t] = 1;}}cout << n << '\n';return 0;
}

AC Code(Python):

n, q = [int(i)for i in input().split()]
a = set([])
t = [int(i)for i in input().split()]for k in t:if k in a:n += 1a.remove(k)else:n -= 1a.add(k)print(n)

C

题目

答案的特性: i = a i i=a_i i=ai。根据这个特性,我们可以对于不在对应位置上的每一个数,让正确的数和它交换。由于数一共只有 N N N 个,交换最多 N − 1 N-1 N1 次,所以可以符合条件。

注意 python 的下标问题。

AC Code(CPP):

#include <iostream>
#include <queue>
using namespace std;
int n;
int a[200100];
int p = -1;
int idx[200100];
queue<pair<int, int>> q;int main() {cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) {idx[a[i]] = i;}int cnt = 0;for (int i = 1; i <= n; i++) {if (a[i] != i) {cnt++;q.push({min(idx[i], i), max(idx[i], i)});int tmp = idx[i];swap(idx[a[i]], idx[i]);swap(a[i], a[tmp]);}}cout << cnt << '\n';while (!q.empty()) {cout << q.front().first << ' ' << q.front().second << '\n';q.pop();}return 0;
}

AC Code(Python)

n = int(input())
a = [int(i) - 1 for i in input().split()]
idx = [0 for i in range(n)]
for i in range(n):idx[a[i]] = i
ans = []
for i in range(n):if a[i] != i:ans.append([min(idx[i], i), max(idx[i], i)])temp = idx[i]idx[a[i]], idx[i] = idx[i], idx[a[i]]a[i], a[temp] = a[temp], a[i]
print(len(ans))
for i in ans:print('%d %d' % (i[0] + 1, i[1] + 1))

D

题目

这个问题须要一点图论知识。

我们可以发现,对于一群人,如果这群人是“联通”的,那么就一定可以将这一群人操作成一个“完全图”。所以对于一群联通的人,操作次数就等于这张图成为完全图的边数(点数乘以点数减一)减去已有的朋友关系。

通过并查集来查找联通块,并快速地解决这个问题。

注意 Python 中递归层数的限制

AC Code(CPP):

#include <iostream>
#define int long long
using namespace std;
int n, m;
int u[200100], v[200100];
int f[200100];
long long cnt[200100], cnt1[200100];
int find(int x) {return x == f[x] ? x : f[x] = find(f[x]);}
bool vis[200100];
long long ans;signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for (int i = 1; i <= n; i++) f[i] = i;for (int i = 1; i <= m; i++) {cin >> u[i] >> v[i];f[find(v[i])] = find(u[i]);}for (int i = 1; i <= m; i++) {cnt[find(u[i])]++;}for (int i = 1; i <= n; i++) {cnt1[find(i)]++;}for (int i = 1; i <= n; i++) {if (find(i) == i)ans += cnt1[i] * (cnt1[i] - 1ll) / 2ll - cnt[i];}cout << ans << '\n';return 0;
}

AC Code(Python):

import sys
sys.setrecursionlimit(998244353)
n, m = [int(i) for i in input().split()]
f = [i for i in range(n + 3)]def find(x):if x != f[x]:f[x] = find(f[x])return f[x]a = []
for i in range(m):a.append([int(i) for i in input().split()])a[i][1] -= 1a[i][0] -= 1f[find(a[i][1])] = find(a[i][0])
cnt = [0] * (n + 3)
cnt1 = [0] * (n + 3)
for i in range(m):cnt[find(a[i][0])] += 1
for i in range(n):cnt1[find(i)] += 1
ans = 0
for i in range(n):if find(i) == i:ans += (cnt1[i] * (cnt1[i] - 1) // 2) - cnt[i]
print(ans)

E

题目

可以想到使用搜索加上记忆化来解决这个问题。设 f ( x ) f(x) f(x) 是把 x x x 变为 0 0 0 的代价,这个值为操作一期望代价和操作二期望代价的最小值,其中操作一期望代价很好算,就是 f ( ⌊ x A ⌋ ) + X f(\lfloor \frac{x}{A} \rfloor) + X f(⌊Ax⌋)+X。而操作二期望代价是这个式子:

f ( x ) = 1 6 f ( ⌊ 1 x ⌋ ) + 1 6 f ( ⌊ x 2 ⌋ ) + 1 6 f ( ⌊ x 3 ⌋ ) + 1 6 f ( ⌊ x 4 ⌋ ) + 1 6 f ( ⌊ x 5 ⌋ ) + 1 6 f ( ⌊ x 6 ⌋ ) + Y f(x)=\frac16f(\lfloor \frac1x \rfloor) + \frac16f(\lfloor \frac x2 \rfloor) + \frac16f(\lfloor \frac x3 \rfloor) + \frac16f(\lfloor \frac x4 \rfloor) + \frac16f(\lfloor \frac x5 \rfloor) + \frac16f(\lfloor \frac x6 \rfloor)+Y f(x)=61f(⌊x1⌋)+61f(⌊2x⌋)+61f(⌊3x⌋)+61f(⌊4x⌋)+61f(⌊5x⌋)+61f(⌊6x⌋)+Y

这个式子看似要无线递归,但是通过移项可以得到这个东西:

f ( x ) = f ( ⌊ x 2 ⌋ ) + f ( ⌊ x 3 ⌋ ) + f ( ⌊ x 4 ⌋ ) + f ( ⌊ x 5 ⌋ ) + f ( ⌊ x 6 ⌋ ) + Y 5 f(x)=\frac{f(\lfloor \frac x2 \rfloor) + f(\lfloor \frac x3 \rfloor) + f(\lfloor \frac x4 \rfloor) + f(\lfloor \frac x5 \rfloor) + f(\lfloor \frac x6 \rfloor)+Y}5 f(x)=5f(⌊2x⌋)+f(⌊3x⌋)+f(⌊4x⌋)+f(⌊5x⌋)+f(⌊6x⌋)+Y

编码就十分简单。

时间复杂度分析

首先,枚举第一种情况是 log ⁡ A ( N ) \log_A(N) logA(N) 的时间复杂度,可以视为没有。

第二种情况:

由于 ⌊ ⌊ N a ⌋ b ⌋ = ⌊ N a b ⌋ \lfloor\frac{\lfloor \frac Na \rfloor}b\rfloor=\lfloor \frac N{ab}\rfloor baN=abN,所以讨论 4 4 4 6 6 6 的情况会被 2 2 2 3 3 3 剪枝。而我们要计算的是 ⌊ N m ⌋ \lfloor \frac Nm\rfloor mN,所以 m m m 可以被表示为 2 x 3 y 5 z 2^x3^y5^z 2x3y5z,而时间复杂度也只有 log ⁡ 2 ( N ) log ⁡ 3 ( N ) log ⁡ 4 ( N ) \log_2(N)\log_3(N)\log_4(N) log2(N)log3(N)log4(N)

AC Code(CPP):

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, a, x, y;
map<long long, double> m;
double f(int now) {if (now == 0) return 0;if (m[now]) return m[now];double sum = y;for (int i = 2; i <= 6; i++) {sum += f(now / i) + y;}m[now] = min({sum / 5.0, f(now / a) + x});return min({sum / 5.0, f(now / a) + x});
}
signed main() {scanf("%lld%lld%lld%lld", &n, &a, &x, &y);printf("%.16lf", f(n));return 0;
}

AC Code(Python):

n, a, x, y = [int(i)for i in input().split()]
m = {}def f(now):if now == 0:return 0if now in m.keys():return m[now]cnt = yfor i in range(2, 7):cnt += f(now // i) + ym[now] = min(cnt / 5, f(now // a) + x)return m[now]print(f(n))

F

题目

可以通过递归函数计算。 f ( l , r , p ) f(l, r, p) f(l,r,p) 负责打印从 l l l r r r 的字符。如果 p p p 等于 0 0 0,那么是正序打印,否则,是倒序打印。每遇到一个括号,就打印括号内的东西,打印顺序反过来。每一对对应的括号可以通过预处理得到。可以预先将每一个大小写预处理,就不用再打印时判断了。(如果括号层数为奇数就要翻转大小写。)或者在打印时判断。

于是可以在 O ∣ S ∣ O|S| OS 的时间复杂度内求解问题。

AC Code(CPP):

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
char s[500100];
int n;
void init() {string s1;cin >> s1;for (int i = 0; i < (int)s1.size(); i++) {s[i + 1] = s1[i];}n = s1.size();
}
int idx[500100], idx1[500100];void f(int l, int r, int p) {if (p == 0) {for (int i = l; i <= r; i++) {if (s[i] == '(') {f(i + 1, idx[i] - 1, 1);i = idx[i];}else {cout << s[i];}}}else {for (int i = r; i >= l; i--) {if (s[i] == ')') {f(idx1[i] + 1, i - 1, 0);i = idx1[i];}else {cout << s[i];}}}
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);init();int cnt = 0;stack<int> st;for (int i = 1; i <= n; i++) {if (s[i] == '(') {cnt++;st.push(i);}else if (s[i] == ')') {cnt--;idx[st.top()] = i;idx1[i] = st.top();st.pop();}else {if (cnt % 2) {if ('a' <= s[i] && s[i] <= 'z') {s[i] -= 'a';s[i] += 'A';}else {s[i] -= 'A';s[i] += 'a';}}}}f(1, n, 0);return 0;
}

AC Code(Python):

import sys
sys.setrecursionlimit(998244353)
s = input()
cnt = 0
idx = [0] * (len(s) + 1)
idx1 = [0] * (len(s) + 1)
stack = []def f(l, r, p):if p == 0:temp = lwhile temp <= r:if s[temp] == '(':f(temp + 1, idx[temp] - 1, 1)temp = idx[temp] + 1else:print(s[temp], end='')temp += 1else:temp = rwhile temp >= l:if s[temp] == ')':f(idx1[temp] + 1, temp - 1, 0)temp = idx1[temp] - 1else:if 'a' <= s[temp] <= 'z':print(chr(ord(s[temp]) - 32), end='')else:print(chr(ord(s[temp]) + 32), end='')temp -= 1for i in range(len(s)):if s[i] == '(':cnt += 1stack.append(i)elif s[i] == ')':cnt -= 1idx[stack[len(stack) - 1]] = iidx1[i] = stack[len(stack) - 1]stack.pop(len(stack) - 1)
f(0, len(s) - 1, 0)

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

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

相关文章

新加坡VPS服务器Linux系统的安全性如何增强

增强新加坡VPS服务器上Linux系统的安全性是至关重要的&#xff0c;以下是一些常见的方法和建议&#xff1a; 更新系统和软件&#xff1a; 定期更新操作系统和安装的软件包&#xff0c;确保系统中的所有组件都是最新版本&#xff0c;以修补已知的漏洞和安全问题。 配置防火墙&am…

109. Python的turtle库简介

109. Python的turtle库简介 【目录】 文章目录 109. Python的turtle库简介1. 什么是turtle库&#xff1f;2. 用turtle库绘制一个爱心图案3. 库的导入方法3.1 直接导入整个库3.2 从库中导入特定的函数或类3.3 导入库中的所有内容3.4 为导入的库设置别名3.5 为导入的函数或变量设…

阿里巴巴Java开发规范——编程规约(3)

# 阿里巴巴Java开发规范——编程规约&#xff08;3&#xff09; 编程规约 &#xff08;四&#xff09; OOP规约 1.【强制】构造方法里面禁止加入任何业务逻辑&#xff0c;如果有初始化逻辑&#xff0c;请放在 init 方法中 这条编程规范的目的是为了保持代码的清晰性、可读性…

HTTP协议中的请求方法及其在前端的应用

简介&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是用于在网络上传输超文本的协议&#xff0c;定义了多种请求方法&#xff0c;用于指定客户端对服务器资源的操作方式。。 1. GET请求 GET请求用于从服务器获取资源&#xff0c;是最常见的请求方法之…

stm32开发三、单片机关键字extern

单片机关键字extern 1 定义 extern 用于指示变量或函数是在其他文件中定义的&#xff0c;但在当前文件中也要使用它。 2 使用场景 当你想在一个文件中使用另一个文件中定义的全局变量或函数时&#xff0c;你可以使用 extern。 它只是声明&#xff0c;不分配内存或分配存储空…

【C++提高】算法

算法 一、遍历算法1. for_each2. transform 二、查找算法1. find2. find_if3. adjacent_find4. binary_search5. count6. count_if 三、排序算法1. sort2. random_shuffle3. merge4. reverse 四、拷贝和替换算法1. copy2. replace3. replace_if4. swap 五、算术生成算法1. accu…

AOP

代理模式 提出问题 现有缺陷 假设我们有一个计算类&#xff0c;里面有加减乘除四个方法&#xff0c;现在我们要为这四个方法添加日志&#xff0c;即在方法执行的前后分别输出一句话&#xff0c;这时我们会发现如下缺陷&#xff1a; 1.对核心业务有干扰。核心业务是加减乘除…

货拉拉0-1数据指标体系构建与应用

目录 一、背景 二、指标体系搭建 2.1 指标设计 2.2 指标体系搭建 2.3 指标维度拆解 三、指标标准化建设 四、指标元数据管理 五、指标应用&未来规划 原文大佬介绍的这篇指标体系构建有借鉴意义&#xff0c;现摘抄下来用作沉淀学习。如有侵权请告知~ 一、背景 指标…

汽车摄像头匿名化处理解决方案,保护信息的安全性和隐私性

随着智能交通和自动驾驶技术的迅猛发展&#xff0c;汽车摄像头已成为现代汽车不可或缺的一部分&#xff0c;摄像头所捕捉的图像信息也引发了日益严峻的信息安全问题。如何在充分利用摄像头功能的同时&#xff0c;保障个人隐私和信息安全&#xff0c;已成为企业亟待解决的问题。…

IP地址定位技术引发的个人隐私保护问题

IP地址定位技术对互联网的影响深远且多面&#xff0c;它不仅改变了网络管理与优化的方式&#xff0c;还极大地推动了在线广告营销、电子商务、地理信息服务等多个领域的发展。然而&#xff0c;与此同时&#xff0c;它也引发了一系列关于个人隐私保护的问题。 首先&#xff0c;I…

vue的学习之用vue写一个hello,vue

根据以下步骤下载vue.js 介绍 — Vue.js 创建一个damo.html &#xff0c;引入vue.js即可 <body><div id"app">{{ message }}</div><!-- Vue --><!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 --><script src"js/vu…

清华新突破,360°REA重塑多智能体系统:全方位提升复杂任务表现

引言&#xff1a;多智能体系统的新篇章——360REA框架 在多智能体系统的研究领域&#xff0c;最新的进展揭示了一种全新的框架——360REA&#xff08;Reusable Experience Accumulation with 360 Assessment&#xff09;。这一框架的提出&#xff0c;不仅是对现有系统的一次重大…

Git提交/拉取的顺序

Git提交代码的流程 1、git add . 2、git commit -m “commit info” 3、git pull origin master 4、git push origin master 第一步表示将本地所有改动代码添加到暂存区 第二步表示将待提交内容和描述信息放到本次提交中 第三步表示将远程代码更新到本地&#xff08;用于解决冲…

P8739 [蓝桥杯 2020 国 C] 重复字符串

[蓝桥杯 2020 国 C] 重复字符串 题目描述 如果一个字符串 S S S 恰好可以由某个字符串重复 K K K 次得到&#xff0c;我们就称 S S S 是 K K K 次重复字符串。例如 abcabcabc 可以看作是 abc 重复 3 3 3 次得到&#xff0c;所以 abcabcabc 是 3 3 3 次重复字符串。 同…

nodejs 版本管理

nvm介绍 管理windows系统下nodejs的多个版本&#xff0c;包括安装、卸载、切换等功能。 安装nvm 在github官网下载nvm的安装包&#xff0c;下载完成之后安装即可。 nvm的基本用法 查看当前nodejs的版本 使用nvm list查看以安装的版本以及当前版本&#xff0c;前面带有*的…

如何修改WordPress数据库表前缀以提高安全性

WordPress作为世界上最受欢迎的内容管理系统之一&#xff0c;吸引了数以百万计的用户。然而&#xff0c;正因为其广泛的使用&#xff0c;WordPress网站也成为了黑客攻击的目标之一。其中一个最常见的安全漏洞是使用默认的数据库表前缀wp_&#xff0c;使得黑客能够更轻松地进行大…

Oracle交换分区测试

1、用exchange分区表减少初始化过程中对业务中断的影响 2、创建分区表 create table t_p (id number,name varchar2(30),addr varchar2(50)) partition by range(id) (partition p1 values less than(10), partition p2 values less than(20), partition p3 values less …

【Python快速上手(一)】

目录 Python快速上手&#xff08;一&#xff09;Python3 基础语法1. 编码2. 标识符3. Python 保留字4. 注释5. 行与缩进6. 多行语句7. import 与 from...import8. 命令行参数 Python快速上手&#xff08;一&#xff09; Python3 基础语法 1. 编码 Python 3 默认使用 UTF-8 编…

sql(ctfhub)

一.整数型注入 输入1 输入2 输入2-1&#xff0c;回显为1的结果&#xff0c;说明是数字型&#xff0c;只有数字型才可加减 判断字段数为2 查询数据库 查表 查列 显示flag内容 二.字符型注入 输入1 输入2 输入2-1&#xff0c;说明为字符型&#xff0c;不是数字型 判断闭合方式为…

【数据分析面试】27. 计算广告评论比例 (SQL)

题目: 计算广告评论比例 假设你有一个ads表&#xff0c;包含ID和广告名称&#xff0c;比如“劳动节衬衫促销”。feed_comments表保存了不同用户在常规信息流中对广告的评论。moments_comments表保存了不同用户在moments中对广告的评论。 编写一个查询&#xff0c;获取广告在f…