CCF CSP认证 历年题目自练Day29

news2025/6/27 8:50:51

题目一

试题编号: 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] + 1

sum_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] += i

for 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 0
    global r
    x = x + 1
    n = x // r
    m = x % r
    return 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) % r
        return 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] - 1
    else:
        right = N - 1
    error += ischange(fi, left, right)

print(error)

总结

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

请添加图片描述

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

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

相关文章

数据库静态脱敏和动态脱敏解决方案 安当加密

安当KDPS数据保护系统的数据库脱敏功能是一种安全策略&#xff0c;它可以将数据库中的敏感数据进行脱敏处理&#xff0c;使得数据在被访问时不会泄露敏感信息。该功能主要具有以下特点&#xff1a; 可扩展性&#xff1a;可以支持多种数据库类型&#xff0c;如Oracle、MySQL、S…

分布式系统开发技术中的CAP定理原理

分布式系统开发技术中的CAP定理原理 在分布式系统开发中&#xff0c;CAP定理&#xff08;一致性、可用性和分区容忍性&#xff09;是指导我们设计、开发和维护系统的核心原理。该定理阐述了分布式系统中一致性、可用性和扩展性之间无法同时满足的矛盾关系&#xff0c;为我们提…

HDMI 基于 4 层 PCB 的布线指南

HDMI 基于 4 层 PCB 的布线指南 简介 HDMI 规范文件里面规定其差分线阻抗要求控制在 100Ω 15%&#xff0c;其中 Rev.1.3a 里面规定相对放宽了一些&#xff0c;容忍阻抗失控在 100Ω 25%范围内&#xff0c;不要超过 250ps。 通常&#xff0c;在 PCB 设计时&#xff0c;注意控…

深度学习_3_张量运算

代码&#xff1a; import torchimport osimport pandas as pd import numpy as npx torch.tensor([[1, 2, 3], [4, 5, 6]]) print(x) sumA x.sum(dim 0) print(sumA) print(torch.sum(x, dim 0, keepdim True)) print(x/torch.sum(x, dim 0, keepdim True) )

『Linux工具之』yum

前言 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所…

rv1126-rknpu-v1.7.3添加opencv库

rv1126所使用的rknn sdk里默认是不带opencv库的&#xff0c;官方所用的例程里也没有使用opencv&#xff0c;但是这样在进行图像处理的时候有点麻烦了&#xff0c;这里有两种办法: 一是先用python将所需要的图片处理好后在转化为bin格式文件&#xff0c;在使用c或c进行读取&…

地下城堡3魂之诗食谱,地下城堡3菜谱37种

地下城堡3魂之诗食谱大全&#xff0c;让你解锁制作各种美食的方法&#xff01;不同的食材搭配不同的配方制作&#xff0c;食物效果和失效也迥异。但有时候我们可能会不知道如何制作这些食物&#xff0c;下面为您介绍地下城堡3菜谱37种。 关注【娱乐天梯】&#xff0c;获取内部福…

Vue-2.8插槽

插槽分为默认插槽&#xff08;组件内定制一处结构&#xff09;、具名插槽&#xff08;组件内定制多处结构&#xff09; 作用域插槽不属于以上&#xff0c;只是插槽的一个传参语法 默认插槽 作用&#xff1a;让组件内部的一些结构支持自定义 需求&#xff1a;要在页面中显示…

Learning Sample Relationship for Exposure Correction 论文阅读笔记

这是中科大发表在CVPR2023的一篇论文&#xff0c;提出了一个module和一个损失项&#xff0c;能够提高现有exposure correction网络的性能。这已经是最近第三次看到这种论文了&#xff0c;前两篇分别是CVPR2022的ENC&#xff08;和这篇文章是同一个一作作者&#xff09;和CVPR20…

初识Java 13-3 异常

目录 try-with-resources语句 一些细节 新特性&#xff1a;try-with-resources中的实际变量 异常匹配 其他可选方式 检查型异常的一些观点 链式异常的使用 异常的使用指南 小结 本笔记参考自&#xff1a; 《On Java 中文版》 try-with-resources语句 层层叠叠的异常很…

消除springboot+thymeleaf时页面的红色波浪线告警

setting->Editor->Inspections取消掉Thymeleaf的√ 效果&#xff1a;

Zabbix登录页面出现数据库访问异常

问题概述 这是我遇到过最无语的一套zabbix服务器部署&#xff0c;也不知道是否有心要刁难我…搞定一波又来一波&#xff0c;每次都不重样的。这次是客户自己不知道倒腾什么东西&#xff0c;竟然是将zabbix密码给改了的。他的意思是项目完毕&#xff0c;公司规定必须要将密码进…

记录:R语言生成热图(非相关性)

今天解决了一个困扰了我很久的问题&#xff0c;就是如何绘制不添加相关性的热图。一般绘制热图是使用corrplot包画相关性图&#xff0c;但是这样有一个前提&#xff0c;就是输入的数据集必须进行相关性分析。那么如果我不需要进行相关性分析&#xff0c;而是直接绘制能够反应数…

微信小程序 movable-view 控制长按才触发拖动 轻轻滑动页面正常滚动效果

今天写 movable-areamovable-view遇到了个头疼的问题 那就是 movable-view 监听了用户拖拽自己 但 我们小程序 上下滚动页面靠的也是拖拽 也就是说 如果放在这里 用户拖动 movable-view部分 就会永远触发不了滚动 那么 我们先可以 加一个 bindlongpress"longpressHandler…

网工内推 | 技术支持工程师,厂商公司,HCIA即可,有带薪年假

01 华为终端有限公司 招聘岗位&#xff1a;初级技术支持 职责描述&#xff1a; 1、通过远程方式处理华为用户在产品使用过程中各种售后问题&#xff1b; 2、收集并整理消费者声音&#xff0c;提供服务持续优化建议&#xff1b; 3、对服务中发现的热点、难点问题及其他有可能造…

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

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

【数据库——MySQL(实战项目1)】(1)图书借阅系统——数据库结构设计

目录 1. 简述2. 功能3. 数据库结构设计3.1 绘制 E-R 图3.2 创建数据库3.3 创建表3.4 插入表数据 1. 简述 经过前期的学习&#xff0c;我们已经掌握数据库基础操作&#xff0c;因此是时候来做一个实战项目了——图书借阅系统。对于图书借阅系统&#xff0c;相信大家不难想到至少…

天猫用户重复购买预测(速通一)

天猫用户重复购买预测&#xff08;一&#xff09; 赛题理解1、评估指标2、赛题分析 理论知识1.缺失值处理2.不均衡样本3.常见的数据分布 数据探索探查影响复购的各种因素1.对店铺分析2.对用户分析3.对用户性别的分析4.对用户年龄的分析 特征工程1、特征工程介绍特征归一化类别型…

Docker系列--镜像和容器备份与恢复的方法

原文网址&#xff1a;Docker系列--镜像和容器备份与恢复的方法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍备份和恢复Docker镜像与容器的方法。 命令对比 保存与导出 docker save&#xff1a;保存的是镜像&#xff08;image&#xff09;。&#xff08;保存的是分层的…

刷新页面,数据丢失

刷新页面数据丢失原因很多&#xff0c;其中有一种是解析错误&#xff0c;没有解构出来。 报错内容如下(类似这个报错)&#xff1a; 数据结构如下&#xff1a; this.$router.push({name: DetailComparison,query: {rowDetail: rowDetail || null} }) 修改数据结构&#xff1a…