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.rhkb.cn/news/157428.html

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

相关文章

解读提示工程(Prompt Engineering)

提示工程&#xff08;Prompt Engineering&#xff09;&#xff0c;也称为上下文提示&#xff0c;是一种通过不更新模型的权重/参数来引导LLM行为朝着特定结果的方法。这是与AI有效交流所需结果的过程。提示工程可以用于各种任务&#xff0c;从回答问题到算术推理乃至各种应用领…

json库的基本使用

目录 1 将python变量转变为json变量 dumps() 2 将json变量转换为python变量 loads() 3 将键值对存储为json文件 dump() 4 读取json文件 前后端常用json进行信息的交互&#xff0c;不转json会有收不到的情况 我们先看一下转换成json的服务 发现该有的信息都有&#x…

Spring Boot中的Redis自动配置与使用

Spring Boot中的Redis自动配置与使用 Redis是一种高性能的开源内存数据库&#xff0c;常用于缓存、会话管理和消息队列等场景。Spring Boot提供了自动配置来简化在Spring应用程序中使用Redis的过程。本文将介绍Spring Boot中的Redis自动配置是什么以及如何使用它来轻松集成Red…

关于一篇什么是JWT的原理与实际应用

目录 一.介绍 1.1.什么是JWT 二.结构 三.Jwt的工具类的使用 3.1. 依赖 3.2.工具类 3.3.过滤器 3.4.控制器 3.5.配置 3.6. 测试类 用于生成JWT 解析Jwt 复制jwt&#xff0c;并延时30分钟 测试JWT的有效时间 测试过期JWT的解析 四.应用 今天就到这了&#xff0c;希…

C++入门指南:类和对象总结友元类笔记(下)

C入门指南:类和对象总结友元类笔记&#xff08;下&#xff09; 一、深度剖析构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 友元类 四、 内部类4.1 概念4.2 特征 五、拷贝对象时的一些编译器优化六、深…

cad由于找不到mfc140u.dll怎么回事?mfc140u.dll丢失的解决方法

当你在使用 CAD&#xff08;计算机辅助设计&#xff09;软件时&#xff0c;如果出现“找不到 mfc140u.dll”的错误提示&#xff0c;这通常意味着你的计算机上缺少这个重要的动态链接库文件。Mfc140u.dll 是 Microsoft Foundation Class&#xff08;MFC&#xff09;库的一部分&a…

深度神经网络压缩与加速技术

// 深度神经网络是深度学习的一种框架&#xff0c;它是一种具备至少一个隐层的神经网络。与浅层神经网络类似&#xff0c;深度神经网络也能够为复杂非线性系统提供建模&#xff0c;但多出的层次为模型提供了更高的抽象层次&#xff0c;因而提高了模型的能力。深度神经网络是一…

季涨约3~8%,DRAM合约价大幅回升 | 百能云芯

据TrendForce的研究显示&#xff0c;第4季DRAM与NAND Flash均价将开始全面上涨。特别是DRAM&#xff0c;预计第4季的合约价将季涨幅约在3%到8%之间。然而&#xff0c;这波上涨是否能持续&#xff0c;取决于供应商是否坚守减产策略以及实际需求的回升程度&#xff0c;尤其值得关…

clone()方法使用时遇到的问题解决方法(JAVA)

我们平时在自定义类型中使用这个方法时会连续遇到 4 个问题。 基础代码如下&#xff1a; class A {int[] a {1,2,3}; }public class Test {public static void main(String[] args) {} } 第一个&#xff1a; 当我们直接调用时报错原因是Object类中的clone方法是被protecte…

Sprint framework Day07:注解结合 xml 配置

前言 Spring注解结合XML配置是指在Spring应用中&#xff0c;使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。 在Spring框架中&#xff0c;我们可以使用注解来定义Bean&#xff0c;如…

笔试、面试总结(网络安全与渗透测试)

什么是同源策略&#xff1f; 为了防止不同域在用户浏览器中彼此干扰&#xff0c;浏览器对从不同来源&#xff08;域&#xff09;收到的内容进行隔离。浏览器不允许任何旧有脚本访问一个站点的 cookie&#xff0c;否则 &#xff0c;会话容易被劫持。只有发布 cookie 的站点能够…

leetCode 583.两个字符串的删除操作 动态规划 + 优化空间复杂度(二维dp、一维dp)

583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: word1 "sea", word2 &qu…

苹果CMS海螺模版V20修复版/加广告代码 ​适合视频影视类网站使用​

最新苹果CMS海螺模版V20修复版&#xff0c;增加广告代码&#xff0c;适合视频影视类网站使用&#xff0c;有兴趣的可以研究研究。 修复说明&#xff1a; 修复多线路时播放页列表点其他线路还是播放默认线路的问题 修复前台黑白切换和字体颜色切换失效 修复微信二维码没有对…

c语言表达式求值--整型提升

什么是整型提升&#xff1f; C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 什么叫缺省整数类型&#xff1f;缺省在计算机里面是默认的意…

【数据结构】线段树

算法提高课笔记 还未更新完 文章目录 原理pushupbuildmodifyquerypushdown&#xff08;懒标记 / 延迟标记&#xff09;扫描线法 原理 时间复杂度&#xff1a;O(logn) 线段树是一棵二叉树&#xff0c;把一段区间分成多个部分 类似堆的方式&#xff0c;用一维数组存整棵树 对…

计算机导论实验——Linux基础入门

使用Xshell登录 Linux 主机 linux命令&#xff1a; cd&#xff1a;去哪里 pwd&#xff1a;在哪里 ls&#xff1a;查看当前有什么文件 mkdir&#xff1a;创建新目录 cp&#xff1a;复制 cat&#xff1a;连接或显示文件 rm&#xff1a;删除 mv&#xff1a;用于移动或重命名文件…

Android Studio版本升级后的问题 gradle降级、jdk升级

Cannot use TaskAction annotation on method IncrementalTask.taskAction$gradle_core() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method. 修改下面两处地方分别为7.0.3、7.3.3Android Gradle plu…

Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍

工作流程&#xff1a; Driver 创建 SparkSession 并将应用程序转化为执行计划&#xff0c;将作业划分为多个 Stage&#xff0c;并创建相应的 TaskSet。Driver 将 TaskSet 发送给 TaskScheduler 进行调度和执行。TaskScheduler 根据资源情况将任务分发给可用的 Executor 进程执…

基于 chinese-roberta-wwm-ext 微调训练中文命名实体识别任务

一、模型和数据集介绍 1.1 预训练模型 chinese-roberta-wwm-ext 是基于 RoBERTa 架构下开发&#xff0c;其中 wwm 代表 Whole Word Masking&#xff0c;即对整个词进行掩码处理&#xff0c;通过这种方式&#xff0c;模型能够更好地理解上下文和语义关联&#xff0c;提高中文文…

数据仓库Hive(林子雨课程慕课)

文章目录 9.数据仓库Hive9.1 数据仓库的概念9.2 Hive简介9.3 SQL语句转换为MapReduce作业的基本原理9.4 Impla9.4.1 Impala简介9.4.2 Impala系统架构9.4.3 Impala查询执行过程9.4.4 Impala与Hive的比较 9.5 Hive的安装和基本操作9.5.1 Hive安装9.5.2 Hive基本操作 9.数据仓库Hi…