信息学奥赛初赛天天练-67-NOIP2018普及组-完善程序2-计数排序、排列、链表、单向链表、双向链表

news2024/12/27 11:02:46

PDF文档公众号回复关键字:20240817

在这里插入图片描述

1 完善程序 (单选题 ,每小题3分,共30分)

最大公约数之和

对于一个 1到 n的排列 P(即 1 到 n 中每一个数在 P中出现了恰好一次),令 q[i] 为第 i个位置之后第一个比 P[i] 值更大的位置,如果不存在这样的位置,则 q[i] = n + 1。举例来说,如果 n = 5 且 P 为 1 5 4 2 3 ,则 q 为2 6 6 5 6

下列程序读入了排列 P ,使用双向链表求解了答案。试补全程序

01 #include <iostream>
02 using namespace std;
03 
04 const int N = 100010;
05 int n;
06 int L[N], R[N], a[N];
07 
08 int main() {
09     cin >> n;
10     for (int i = 1; i <= n; ++i) {
11        int x;
12        cin >> x;
13         ① ;
14     }
15     
16     for (int i = 1; i <= n; ++i) {
17         R[i] = ② ;
18         L[i] = i - 1;
19     }
20     
21     for (int i = 1; i <= n; ++i) {
22         L[ ③ ] = L[a[i]];
23         R[L[a[i]]] = R[ ④ ];
24     }
25     
26     for (int i = 1; i <= n; ++i) {
27     	   cout << ⑤ << " ";
28     }
29     
30     cout << endl;
31     return 0;
32 }

1 ①处应填( )

2 ②处应填( )

3 ③处应填( )

4 ④处应填( )

5 ⑤处应填( )

2 相关知识点

1) 计数排序

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,具体思路为
统计相同元素出现次数
根据统计的结果将序列回收到原来的序列中

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a[10]={3,4,2,7,5,4,3,3,3,5};
	int cnt[7]={0};//cnt数组记录对应下标出现次数 
	for(int i=0;i<10;i++){
		cnt[a[i]]++;
	}
	
	for(int i=0;i<=7;i++){//枚举对应范围的数 从最小到最大,本示例从0~7即可 
		while(cnt[i]>0){//一个数字出现多次时,cnt[i]为对应的数为出现几次
			cout<<i<<" ";
			cnt[i]--;
		}
	}
	
	return 0;
}

/*
输出
2 3 3 3 3 4 4 5 5 7 
*/ 

排列应用

对于一个 1到 n的排列 P(即 1 到 n 中每一个数在 P中出现了恰好一次),由于1~n中的每个数只出现1次,所以对排列中的数进行排序,同时记录其在原数组的下标位置

#include<bits/stdc++.h>
using namespace std;

int main(){
	int P[6]={0,1,5,4,2,3};
	int a[6]={0};
	/*
	 以P[i]为a下标,a的值记录P[i]中的下标 
	 a的下标顺序对P中的数进行了排序 
	*/
	for(int i=1;i<=5;i++){
		a[P[i]]=i;
	}
	
	for(int i=1;i<=5;i++){//输出对P排序后在P中的下标 
		cout<<a[i]<<" ";
	}
	cout<<endl;
	for(int i=1;i<=5;i++){//输出通过a数组对P排序后的值 
		cout<<P[a[i]]<<" ";
	}
	return 0;
}
/*
输出 
1 4 5 3 2
1 2 3 4 5
*/ 

2 链表

链表是一种常见的数据结构,它是由一系列节点(Node)组成,每个节点包含两部分:数据域和指针域。数据域用于存储数据,指针域用于存储下一个节点的地址。链表的第一个节点称为头节点(Head),最后一个节点称为尾节点(Tail),尾节点的指针域指向空(NULL)

单向链表

一种最简单的结点结构如图所示,它是构成单链表的基本结点结构

在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。

因为只有一个指针结点,称为单链表

双向链表

单向链表只有一个方向,结点只有一个后继指针 next 指向后面的结点。

双向链表,顾名思义,它支持两个方向,每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点

在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。

因为有1左指针节点和1个右指针节点,同时指向2个方向的节点,因此称为双向链表

3 思路分析

1 ①处应填( a[x]=i )

分析

此处使用计数排序思想,通过a数组从小到大记录在排列P的位置
比如P 1 5 4 2 3
对应a 1 4 5 3 2  
10     for (int i = 1; i <= n; ++i) {
11        int x;
12        cin >> x;
13         ① ;
14     }

2 ②处应填( i+1 )

分析

L数组代表P数组的左指针
L数组代表P数组的右指针
例如P 1 5 4 2 3 对应1 2 3 4 5下标
则
L 0 0 1 2 3
R 2 3 4 5 6
所以此处填i+1
16     for (int i = 1; i <= n; ++i) {
17         R[i] = ② ;
18         L[i] = i - 1;
19     }

3 ③处应填( R[a[i]] )

分析

从小到大去除当前数字,当前数字是数组中最小的数字
去除当前数字后,下一个带去除的,是数字中最小数字
此处通过双向链表去除当前数字
当前节点的后1个节点左指针指向当前节点前1个节点
当前节点的前1个节点右指针指向当前节点后1个节点
所以
22         L[ R[a[i]] ] = L[a[i]];
23         R[L[a[i]]] = R[a[i]];

21     for (int i = 1; i <= n; ++i) {
22         L[ ③ ] = L[a[i]];
23         R[L[a[i]]] = R[ ④ ];
24     }
以 1 5 4 2 3为例,第1个删除1
删除1前

删除1后,2节点左指针指向0节点,0节点右节点指向2节点,1就从链表中被删除了
1节点右指针指向2节点,没有改变,1后面比1大的第1个节点为2节点

例如 1 5 4 2 3 中的5,后面4 2 3 都比5小,因此应该是n+1=5+1=6
按照数字从小到大对链表进行删除,5为最后1个被删除的
删除4前,5对应节点为2,右指针指向3节点(数字4)

删除4后,右指针指向6节点

删除5后,对应R数组的值,以及左右指针如下

4 ④处应填( a[i] )

分析

同3

5 ⑤处应填( R[i] )

分析

一开始R数组是当前数字的右边节点
    
从小到大逐一删除,如果右边比当前大,当前的右指针不会被删除
如果右边比自己小会先删除右边,删除右边时,会把当前的右指针指向更大的
这种删除方法可以保证R[i]是右边第1个比R[i]大的数
所以此处填R[i]
26     for (int i = 1; i <= n; ++i) {
27     	   cout << ⑤ << " ";
28     }

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

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

相关文章

【数学建模】趣味数模问题-状态转移模型的应用

概述 状态转移模型结合图论&#xff0c;通过经典的智力问题展示了其在求解实际问题中的巧妙应用。虽然这些问题不需要复杂的数学知识&#xff0c;但通过建立数学模型&#xff0c;可以将其转化为标准的图论模型来解决。 问题1&#xff1a;人、狼、羊、菜渡河问题 问题描述&…

CUDA Out of Memory :CUDA内存不足的完美解决方法

CUDA Out of Memory &#x1f6d1;&#xff1a;CUDA内存不足的完美解决方法 CUDA Out of Memory &#x1f6d1;&#xff1a;CUDA内存不足的完美解决方法摘要 &#x1f4dd;引言 &#x1f31f; 什么是 CUDA Out of Memory 错误&#xff1f; &#x1f914;基本定义常见场景 常见的…

基于spring boot的小型诊疗预约平台的设计与开发

TOC springboot262基于spring boot的小型诊疗预约平台的设计与开发 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进…

canal数据同步工具介绍与应用

canal服务 canal介绍canal版本与环境canal 服务集canal应用场景&#xff1a; canal常见问题xml配置问题连接认证问题jar版本问题连接问题 canal介绍 ‌1、Canal是‌阿里巴巴开源的‌MySQL增量数据订阅和消费工具&#xff0c;通过模拟MySQL的‌slave与‌master交互&#xff0c;捕…

XSS- DOMclobbering与svg深度利用

目录 源码展示 解法一&#xff1a;绕过过滤-DOM clobbering 什么是DOM clobbering DOM clobbering原理 全局变量自动创建 属性名冲突 影响脚本执行 逐过程分析 源码展示 <script>const data decodeURIComponent(location.hash.substr(1));;const root documen…

深度学习------------池化层

目录 池化层二维最大池化填充、步幅和多个通道平均池化层 总结池化层的代码部分实现池化层的正向传播验证二维最大池化层的输出该部分总代码 验证平均池化层该部分总代码 填充和步幅深度学习框架中的步幅与池化窗口的大小相同该部分总代码 填充和步幅可以手动设定该部分总代码 …

adb查看当前运行的应用的包名和Activity(模拟器也可以)

adb查看当前运行的应用的包名和Activity(模拟器也可以) 在adb 中&#xff0c;输入命令&#xff1a;adb shell 进入adb模式 adb shell dumpsys window w |findstr / |findstr name 输入完成后会显示当前运行的应用的包名和Activity(模拟器也可以) 例如抖音 ** **

布隆过滤器--极致的速度

前言 上一篇博客提到了位图&#xff0c;位图是十分高效的数据结构&#xff0c;但可惜的是只支持整型&#xff0c;今天这篇博客的主角是布隆过滤器&#xff0c;他与位图有异曲同工之妙。&#xff08;不了解位图可以点击下面这篇博客快速了解&#xff09;位图&#xff08;bitse…

【初阶数据结构】链表(附题)

目录 一、顺序表的问题及思考 二、单链表 2.1链表的概念及结构 2.2.单链表的实现 2.2.1.节点的定义 2.2.2.链表的打印 2.2.3.头部插入删除/尾部插入删除 a.创建节点 b.尾插 c.头插 d.尾删 e.头删 2.2.4.查找数据 2.2.5.在指定位置之前插入数据 2.2.6删除pos节点 …

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65&#xff08;主&#xff09;15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…

联想电脑如何查看ip地址?详细介绍几种方法

随着互联网的普及和技术的飞速发展&#xff0c;IP地址已成为我们日常网络活动中不可或缺的一部分。无论是访问网站、远程办公还是进行网络游戏&#xff0c;IP地址都扮演着重要的角色。对于联想电脑用户来说&#xff0c;了解如何查看自己的IP地址是一项基本技能。虎观代理小二将…

leetcode 2221.数组的三角和

1.题目要求: 给你一个下标从 0 开始的整数数组 nums &#xff0c;其中 nums[i] 是 0 到 9 之间&#xff08;两者都包含&#xff09;的一个数字。nums 的 三角和 是执行以下操作以后最后剩下元素的值&#xff1a;nums 初始包含 n 个元素。如果 n 1 &#xff0c;终止 操作。否则…

拯救者杯OPENAIGC开发者大赛今日迎来决赛,现场179支参赛团队角逐AI桂冠

2024拯救者杯OPENAIGC开发者大赛于今日&#xff08;8月17日&#xff09;在上海中庚聚龙酒店迎来精彩决赛&#xff01; 创未来AI应用赛 拯救姬AI创意赛 AI Agent极限挑战赛 三大赛道决战巅峰 37位行业大咖评审 企业&高校179支顶尖开发团队同台竞技 挑战赛33支团队现场…

golang(gin框架)结合前端h5用户注册(演示版)

1、在宝塔上软件商店安装&#xff1a;GO语言版本管理器&#xff1b; 2、把本地文件上传到服务器端&#xff1b; 3、 4、 Go 语言官方提供了一个适合中国大陆用户使用的模块代理 goproxy.cn。你可以配置 Go 使用这个代理&#xff0c;具体操作如下&#xff1a; 临时设置代理…

【Verilog-CBB】开发与验证(5)——RS后向打拍器

引言 接上篇&#xff0c;完成了RS前向打拍器的CBB设计。RS后向打拍器的设计则主要是为了缓解ready信号的时序问题。后向打拍器是对ready以及数据信号进行寄存。 RS后向打拍器的设计逻辑是这样的&#xff0c;复位时&#xff0c;ready缓存器&#xff08;深度为1&#xff09;对上…

栈与递归——385、341、394

385. 迷你语法分析器(中等) 给定一个字符串 s 表示一个整数嵌套列表&#xff0c;实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。 列表中的每个元素只可能是整数或整数嵌套列表 示例 1&#xff1a; 输入&#xff1a;s "324", 输出&#xff1a;324 解释…

8个Python实用技巧,让你的代码效率飞起来

想要成为一名Python编程高手&#xff0c;不仅需要掌握语言的基础知识&#xff0c;还需要了解一些高效编程的技巧。 一、列表推导式 列表推导式是Python中一种快速生成列表的方法&#xff0c;相比传统的循环方式&#xff0c;代码更简洁、更高效。 # 使用列表推导式生成0到9的平…

vuex刷新数据丢失解决方式(插件)

1、下载插件 npm install vuex-persistedstate --save2、引入即可 import Vue from vue import Vuex from vuex import createPersistedState from vuex-persistedstate Vue.use(Vuex)const store new Vuex.Store({state: {login: null},mutations: {setlogin(state, login) …

总结HashMap, HashTable, ConcurrentHashMap 之间的区别

HashMap, HashTable, ConcurrentHashMap都是使用同一种数据结构&#xff08;数组链表&#xff09;&#xff1b; HashMap多线程状态下是不安全的&#xff1b;HashTable和ConcurrentHashMap是在HashMap的基本的数据结构上进行优化&#xff0c;使他们在多线程下是安全的&#xff…

24/8/17算法笔记 AC算法

AC算法通常指的是Actor-Critic&#xff08;演员-评论家&#xff09;算法&#xff0c;它是强化学习中的一种算法框架&#xff0c;用于解决代理&#xff08;agent&#xff09;在环境中的决策问题。Actor-Critic方法结合了价值估计和策略优化&#xff0c;通常比纯粹的价值迭代或策…