CCF CSP认证 历年题目自练Day29

题目一

试题编号: 202112-1
试题名称: 序列查询
时间限制: 300ms
内存限制: 512.0MB
请添加图片描述
样例1输入
3 10
2 5 8

样例1输出
15
请添加图片描述
样例2输入
9 10
1 2 3 4 5 6 7 8 9

样例2输出
45
请添加图片描述

题目分析(个人理解)

  1. 还是先看输入,第一行输入n表示第二行有n个数,N表示有多大的范围,N表示序列i 范围[0,n),关键在于找到第二行内容输入的和f(i)之间的关系。i相当于位序,N确定了位序到哪结束,第二行表示在哪个位序开始赋值(值从1开始),第二行第二个以及之后的数值表示在此位序在前1位序值的基础上加一。
  2. 突然之间发现了一个巧妙的算法,其实题目中的提示也给出了,用乘法代替相同的数相加,比如以第一个样例为例子,我现在题目给的A列表中追加写入N,也就是A=[0,2,5,8,10]
  3. 那我最后输出的和就是从0遍历到n + 1
    s += i * (A[i+1] - A[i]),
    运算过程:13+23+3*2=15
  4. 最后输出s即可。
  5. 上代码!!!
n_N =list(map(int,input().split()))
#等价于 n_N = [int(num) for num in input().split()]
A = [0] + [int(a) for a in input().split()] + [n_N[1]]
S = 0
for i in range(n_N[0] + 1):S += i * (A[i+1] - A[i])
print(S)

题目二

试题编号: 202112-2
试题名称: 序列查询新解
时间限制: 1.0s
内存限制: 512.0MB
请添加图片描述
样例1输入
3 10
2 5 8

样例1输出
5
请添加图片描述
样例2输入
9 10
1 2 3 4 5 6 7 8 9
Data
样例2输出
0
Data
样例3输入
2 10
1 3
Data
样例3输出
6
请添加图片描述

题目分析(个人理解)

  1. 我们可以看到测试的规模,如果利用暴力法,我们只能过70%样例,最后获得70%的分,所以不能直接用暴力的方法。暴力求解思路:先创建两个列表分别表示f(i)和g(i)最后依次遍历求作差之后的绝对值即可。
  2. 暴力求解的代码:理论上应该是le9+5但是会超时,显示0分。(le是科学计数法表示方法)
n, N = map(int, input().split())
ori_li = list(map(int, input().split()))f = [0 for _ in range(int(1e7 + 5))]
dif = [0 for _ in range(int(1e7 + 5))]
for i in ori_li:dif[i] = dif[i] + 1sum_f = 0
index = 1
fx = 0
r = (N // (n + 1))
for i in range(1, N):f[i] = f[i - 1] + dif[i]sum_f += abs(f[i] - (i // r))print(sum_f)
  1. 考虑用N太浪费时间,发现如果用n进行循环,时间就不会超出限制,又能够发现A[i-1]~A[i]内f的值都是一样的,所有的g的值其实就是i/r的整数部分,因此一开始想到把全部的f的值加起来,g的值加起来作差就行,但最后发现不对,因为中间有些做完差后需要取绝对值。

  2. 可以采用离散化加二分法,(学过概率论的同学指定知道离散型和连续型数据) 就考虑在已经分好的 A[i-1]~A[i]区间内再去找哪一部分大于g(这里由前面推论可知g的值和i有关,因此分别求出左右两端的区间端点g值判断划分即可),然后再以r为区间长度进行循环求解。

  3. 如何用二分查找算法:

  4. bisect模块是Python标准库中的一个模块,提供了对有序列表的插入和搜索操作的支持。它基于二分查找算法,可以高效地在有序列表中查找或插入元素。
    bisect模块中包含了以下主要函数和方法:
    bisect(list, value, lo=0, hi=len(list), key=None):在有序列表中查找将值插入的位置,并返回该位置的索引,它是 bisect_right 的别名。
    bisect_left(list, value, lo=0, hi=len(list), key=None):在有序列表中查找将值插入的位置,并返回左侧的索引(相同值的最左边位置)。
    bisect_right(list, value, lo=0, hi=len(list), key=None):在有序列表中查找将值插入的位置,并返回右侧的索引(相同值的最右边位置)。
    insort(list, value, lo=0, hi=len(list), key=None):将值插入有序列表中的适当位置,它是 insort_right 的别名。
    insort_left(list, value, lo=0, hi=len(list), key=None):将值插入有序列表中的最左侧位置。
    insort_right(list, value, lo=0, hi=len(list), key=None):将值插入有序列表中的最右侧位置。
    这些函数和方法可用于处理各种有序列表的操作,如插入元素、查找元素的位置、维持列表的有序性等。

  5. bisect
    函数定义:bisect(list, value, lo=0, hi=len(list))
    参数:
    list: 有序列表。
    value: 要插入的值。
    lo (可选): 搜索的起始位置,默认为0。
    hi (可选): 搜索的结束位置,默认为列表长度。
    作用:在有序列表中查找将值插入的位置,并返回该位置的索引。

  6. bisect_left
    函数定义:bisect_left(list, value, lo=0, hi=len(list))
    参数:与 bisect()函数相同。
    作用:在有序列表中查找将值插入的位置,并返回左侧的索引(相同值的最左边位置)。
    用法示例:
    import bisect
    numbers = [1, 3, 5, 5, 7, 9]#查找将值 5 插入 numbers 的最左侧索引位置
    index = bisect.bisect_left(numbers, 5)
    print(index) # 输出: 2
    在这个例子中,列表 numbers中有两个值为5的元素。通过使用 bisect_left()函数,我们可以找到将值5插入到列表中的最左侧索引位置,即索引2。

  7. 其实这个解题思路还可以联想成一个频率分布直方图(实际频率分布直方图就是把连续型转化成离散型)。

  8. 上代码!!!

# 输入的数据
n,N = map(int,input().split())
A = [0]
A.extend(list(map(int,input().split())))
A.append(N)
r = N // (n+1)
B = []
for i in range(N//r + 2):if i*r >= N: break B.append(i*r)
B.append(N)
s = list(set(A+B))
s.sort()
L = len(s)
# 离散化
tree = [0]*(L-1)
from bisect import bisect_left as bl
for i in range(len(A) - 1):a,b = bl(s,A[i]),bl(s,A[i+1])for j in range(a,b):tree[j] += ifor i in range(len(B) - 1):a,b = bl(s,B[i]),bl(s,B[i+1])for j in range(a,b):tree[j] -= i
# tree求两边的差值的划分
ans = 0
for i in range(L-1):# tree[i]代表的是差值,s[i+1] - s[i]代表的是区间的长度ans += abs(tree[i]*(s[i+1]-s[i]))
print(ans)
  1. 第二种方法:
  2. 刚开始我只注意到在f(x)区间上分段,计算给定i(索引)下前g(x)的和,然后f(x)段和减去下面g(x)的和就可以了;事实上是我想太少了。因为在同样f(x)段下依然不能简单的减去g(x)的分段和;比如
    f(x) 1 1 1
    g(x) 0 1 2
    |g(x)-f(x)| 1 0 1
    如果按之前的思路,则计算结果为0,但实际结果为2;
    这里里面涉及到的就是如果在同一段f(x)下,如果g(x)都小于f(x)或都大于f(x)的话可以直接相减,但如果有“转折点”的话就要再分情况计算了。
  3. 我们可以发现g(i)其实可以看作是r(N//(n+1))个首项为0,公差为1的等差数列;等差数列求和公式Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2,(r个完整的等差数列求和再加最后几个不完整的)。
  4. 判断是不是转折点:这里要判断要么区间内值全小于等于f(i),要么区间内值全大于等于f(i),这里f(i)实际就是i-1;这里等于放不放没影响,递增函数,同时满足这两个条件,有点像做高中数学函数恒成立问题。
  5. 如果没有转折点,直接f(x)区间和减g(x)区间和;如果有转折点,找出转折点,从转折点处分段求。
  6. 上代码!!!

n, N = tuple(map(int, input().split()))
# 有用的点
A = [0] + [int(x) for x in input().split()]# 计算gi数列下标到x的和
def h(x):if x <= 0:return 0global rx = x + 1n = x // rm = x % rreturn int(n * (r * (n - 1) / 2 + m))# 对下标为left到right的abs(fi-gi)求和,包括left和right两点
def cal(fi, left, right):return abs(h(right) - h(left - 1) - fi * (right - left + 1))# 判断是否有转折点,并返回error增加量
def ischange(fi, left, right):# 没有转折点if left // r >= fi or right // r <= fi:return cal(fi, left, right);# 出现转折点else:# 算出第一个转折点splitindex = left + r * (fi - (left + 1) // r) + r - (left + 1) % rreturn cal(fi, left, splitindex) + ischange(fi, splitindex + 1, right)r = N // (n + 1)
error = 0# 根据fi的数值来分组,开始遍历
for fi in range(n + 1):left = A[fi]if fi < n:right = A[fi + 1] - 1else:right = N - 1error += ischange(fi, left, right)print(error)

总结

人生总有一段寂寞,孤独,淋着雨的路要自己走下去,如果你感到困难重重,那么说明你在爬上坡,你在进步;坚持下去,等你攀过高峰,淋过风雨,到达顶峰时就会知道坚持的意义了。				——————————shangzhaoyun 2023.10.12

请添加图片描述

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

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

相关文章

Chrome Extensions v3 迁移清单

一、前置问题 1.1为什么需要迁移 v3&#xff1f; Chrome 计划完全停止 v2 版本维护&#xff0c;后续 v2 版本将无法上架谷歌插件商店&#xff0c;除此之外&#xff0c;未来新版本 Chrome 对于 v2 版本插件的限制会越来越大&#xff0c;比如安全性限制 iframe 嵌套只能通过沙盒…

云原生Kubernetes:Rancher管理k8s集群

目录 一、理论 1.Rancher 2.Rancher 安装及配置 二、实验 1.Rancher 安装及配置 三、问题 1. Rancher 部署监控系统报错 四、总结 一、理论 1.Rancher (1) 概念 Rancher 简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台&#xff0c;实现了 Kubernetes …

利用MobaXterm连接服务器的全程配置

一、服务器上的操作 1.1 保证openssh的安装 openssh安装命令如下 apt-get update apt install openssh-server1.2 保证SSH服务没有在相应端口上侦听连接 1确保本地 SSH 服务正在运行 可以尝试使用以下命令检查 SSH 服务的状态&#xff08;在大多数 Linux 系统上&#xff0…

分布式存储系统Ceph应用详解

Ceph的应用 一、Ceph 存储池(Pool)1.1 Ceph存储池的基本概念1.2 原理1.3 一个Pool资源池应该包含多少PG数&#xff1f;1.4 Ceph 存储池相关管理命令1.4.1 创建1.4.2 查看1.4.3 修改1.4.4 删除 二、 CephFS文件系统MDS接口三、创建CephFS文件系统MDS接口3.1 服务端操作Step1 在管…

【frp实现内网穿透踩坑到成功篇】

【frp实现内网穿透踩坑到成功篇】 背景&需求配置服务器端配置客户端总结 背景&需求 白嫖了一个tencent入门级服务器 ∗ 1 *1 ∗1&#xff0c;学校实验室内网服务器 ∗ 1 *1 ∗1&#xff0c;需要访问内网的服务器。一顿搜寻资料后确定大致的路子&#xff1a; 第一步是…

虹科分享 | 独特的FRER机制:TSN如何确保网络的可靠性?

1.IEEE802.1 CB协议 Frame Replication and Elimination for Reliability(FRER)是IEEE 802.1CB协议的一个重要特性&#xff0c;旨在增强以太网网络的可靠性。FRER利用帧复制和消除技术提供冗余保护和从连接故障中快速恢复。 FRER-IEEE 802.1CB协议的应用场景&#xff1a; 高…

【HttpRunner】接口自动化测试框架

简介 2018年python开发者大会上&#xff0c;了解到HttpRuuner开源自动化测试框架&#xff0c;采用YAML/JSON格式管理用例&#xff0c;能录制和转换生成用例功能&#xff0c;充分做到用例与测试代码分离&#xff0c;相比excel维护测试场景数据更加简洁。在此&#xff0c;利用业…

阿里云韩国服务器测试IP地址及公网带宽收费价格表

阿里云服务器韩国&#xff08;首尔&#xff09;地域公网带宽价格表&#xff0c;1M带宽价格是23.0元/月&#xff0c;按使用流量1GB价格是0.8元&#xff0c;阿里云韩国服务器测试IP地址&#xff1a;149.129.12.20&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云韩国服务器…

火伞云Web应用防火墙的特点与优势

在前文中&#xff0c;我们已经介绍了Web应用防火墙&#xff08;WAF&#xff09;的基本原理和重要性。接下来&#xff0c;我们将深入探讨火伞云Web应用防火墙的特点与优势&#xff0c;了解它如何为企业提供更为完善和专业的网络安全保障。 一、强大的防御能力 火伞云Web应用防火…

SVN报错fail to run the WC Db work queue associated with,清理失败,乱码的解决方式

替换掉 wc.db 文件即可 SVN报错fail to run the WC Db work queue associated with&#xff0c;清理失败&#xff0c;乱码的解决方式_svn failed to run the wc db-CSDN博客

再谈Java泛型

一.类型参数的约束 我们可以对泛型传进来的参数做一些约束&#xff0c;比如说 用extends表明传进来的参数类型必须是必须是某个类型的子类型或者本身 当然也可以用接口约束&#xff0c;也是用extends表明传进来的参数类型必须实现某个接口。用&连接&#xff0c;注意class…

python+深度学习+opencv实现植物识别算法系统 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的植物识别算法研究与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;4分 &#x1f9ff; 更多…

论文阅读/写作扫盲

第一节&#xff1a;期刊科普 JCR分区和中科院分区是用于对期刊进行分类和评估的两种常见方法。它们的存在是为了帮助学术界和研究人员更好地了解期刊的学术质量、影响力和地位。 JCR分区&#xff08;Journal Citation Reports&#xff09;&#xff1a;JCR分区是由Clarivate Ana…

虹科方案 | AR助力仓储物流突破困境:规模化运营与成本节约

文章来源&#xff1a;虹科数字化AR 点击阅读原文&#xff1a;https://mp.weixin.qq.com/s/xis_I5orLb6RjgSokEhEOA 虹科方案一览 HongKe DigitalizationAR 当今的客户体验要求企业在人员、流程和产品之间实现全面的连接。为了提升整个组织的效率并提高盈利能力&#xff0c;物流…

【2023】redis-stream配合spring的data-redis详细使用(包括广播和组接收)

目录 一、简介1、介绍2、对比 二、整合spring的data-redis实现1、使用依赖2、配置类2.1、配置RedisTemplate bean2.2、异常类 3、实体类3.1、User3.2、Book 4、发送消息4.1、RedisStreamUtil工具类4.2、通过延时队列线程池模拟发送消息4.3、通过http主动发送消息 5、&#x1f3…

UWB承启定位基站

UWB承启定位基站 随着我们使用UWB做超高精度的定位项目越来越多&#xff0c;我们发现之前的定位基站完全站在二维或三维的角度去设计还是存在对应的缺陷&#xff0c;这个时候需要在很短的距离内安装多一个基站&#xff0c;对于用户来说&#xff0c;会觉得设备变多了&#xff0…

多目标鳟海鞘算法(Multi-objective Salp Swarm Algorithm,MSSA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标鳟海鞘算法MSSA 多…

ABB机器人关于重定位移动讲解

关于机器人如何重定位移动&#xff0c;首先来看一下示教器上的重定位移动是在哪。 从图中所示的坐标位置和操纵杆方向得知&#xff0c;重定位的本质是绕X、Y、Z轴的旋转。那么实现跟摇杆一样的操作&#xff0c;就可以通过改变当前位置的欧拉角来实现&#xff0c;参考Rapid指令…

《Unity Shader 入门精要》笔记07

透明效果 为什么渲染顺序很重要Unity Shader的渲染顺序透明度测试透明度混合开启深度写入的半透明效果ShaderLab 的混合命令混合等式和参数混合操作常见的混合类型 双面渲染的透明效果透明度测试的双面渲染透明度混合的双面渲染 Unity中通常使用两种方法来实现透明效果&#xf…

openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考

文章目录 openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考99.1 参数说明99.2 认证方式 openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考 99.1 参数说明 表 1 参数说明 参数名称描述取值范…