【CSP试题回顾】202112-2-序列查询新解

2024-03-09 06:04

本文主要是介绍【CSP试题回顾】202112-2-序列查询新解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CSP-202112-2-序列查询新解

关键点:时间复杂度

本题关键在于它避免暴力枚举法的时间复杂度。暴力枚举法可能会对每一对可能的 f(x)g(x) 组合进行比较,其时间复杂度为 O ( n 2 ) O(n^2) O(n2),这对于大数据集来说是不可行的。

  • 【解决思路】:通过逐步遍历 f(x)g(x) 的值(每次只移动到下一个 f(x)g(x) 值),将时间复杂度降低到了 O ( n ) O(n) O(n)。这种方法只需要遍历一次 f(x)g(x) 的所有值,大大减少了计算量。

  • 这种方法的效率提高主要是因为它保持了 f(x)g(x) 索引的逻辑顺序,这样就能在单个循环内完成所有的计算,避免了不必要的重复比较。

解题思路

1.初始化

  • FiGi 分别是 f(x)g(x) 当前索引的指针,初始值都设置为 0。
  • lastIndex 表示最近处理的点的位置,初始化为 0。
  • error 用于累积总误差,也是从 0 开始的。

2.遍历过程

  1. 循环条件while 循环会持续,直到 FiGi 其中一个超过各自数组的长度。确保所有的 f(x)g(x) 值都被遍历

  2. 找到下一个处理点(重要):循环中,首先确定下一个处理点的位置 nextIndex。这是当前 f(x)(由 arrF_x[Fi] 给出)和 g(x)(由 arrG_x[Gi] 给出)值中较小的一个。这个点是当前关注的位置,因为它表示下一个即将处理的 f(x)g(x) 的值。

  3. 计算长度和误差(重要):根据 nextIndexlastIndex(上一个点的位置),计算这两点之间的距离 length = nextIndex - lastIndex。然后,利用这段长度和 FiGi 之间的差的绝对值更新总误差 error。这个差的绝对值代表在此段中 f(x)g(x) 之间的偏差。

  4. 更新索引(重要):如果 arrF_x[Fi](当前 f(x) 的值)是 nextIndex,那么 Fi 自增以移动到 f(x) 的下一个值。同样,如果 arrG_x[Gi](当前 g(x) 的值)是 nextIndex,那么 Gi 自增以移动到 g(x) 的下一个值。这个步骤确保了在每次迭代后,FiGi 至少有一个向前移动。

  5. 重复过程:更新 lastIndexnextIndex,然后重复循环,直到遍历完所有的 f(x)g(x) 值。

3.逐步遍历的意义

  • 通过逐步遍历,代码能够有效地计算在每一小段上 f(x)g(x) 的近似误差,并累积这些误差以得到整体误差。这种方法利用了线性遍历的策略,减少了计算复杂度,相比暴力方法有显著的性能提升。

完整代码

#include<iostream>
#include<vector>
using namespace std;long long n, N, error, r;int main() {   cin >> n >> N; // 输入n和Nr = N / (n + 1); // 计算每个区间的长度vector<long long> arrF_x(n); // 存储f(x)的值for (int i = 0; i < n; i++) {cin >> arrF_x[i]; // 输入f(x)的值}arrF_x.push_back(N); // 将N作为最后一个f(x)的值,确保能够覆盖全部范围vector<long long> arrG_x; // 存储g(x)的值for (int i = r; i < N; i += r) {arrG_x.push_back(i); // 按照间隔r生成g(x)的值}if (arrG_x.back() != N) { // 确保N也作为g(x)的一个值arrG_x.push_back(N);}long long Fi = 0, Gi = 0, lastIndex = 0; // 初始化索引和上一个点的位置while (Fi < arrF_x.size() && Gi < arrG_x.size()) { // 遍历f(x)和g(x)long long nextIndex = min(arrF_x[Fi], arrG_x[Gi]); // 找到下一个处理点的位置long long length = nextIndex - lastIndex; // 计算两点之间的长度lastIndex = nextIndex; // 更新上一个点的位置error += length * abs(Fi - Gi); // 更新误差if (arrF_x[Fi] == nextIndex) Fi++; // 如果f(x)到达下一个点,则移动Fiif (arrG_x[Gi] == nextIndex) Gi++; // 如果g(x)到达下一个点,则移动Gi}cout << error; // 输出总误差return 0;
}

请添加图片描述

这篇关于【CSP试题回顾】202112-2-序列查询新解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/789738

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技