蓝桥杯2025年第十六届省赛真题-冷热数据队列(C语言)

2022年蓝桥杯省赛真题解析(C++B组) 300,寄! 阅读详情

题目描述

小蓝是一名计算机专业的学生,最近他学习了《操作系统》、《数据结构》 等课程,他设计了一种名为 “冷热数据队列” 的数据结构,来对数据页进行管理。 

冷热数据队列 q 可以看做由两个子队列组成:长度为 n1 的热数据队列 q1 和长度为 n2 的冷数据队列 q2 。当我们需要访问某个数据页 p 时:

1)若 p 不在队列 q 中(即既不在 q1 中,也不在 q2 中),则加载数据页 p ,并插入到 q2 的首部。 

2)若 p 已经在队列 q 中,则将 p 移动至 q1 首部。 

3)当 q1 或 q2 队列容量不足时,会将其尾部的数据页淘汰出去。 

4)当 q1 已满,但 q2 未满时,从 q1 中淘汰出的数据页会移动到 q2 首部。

输入格式

输入的第一行包含两个正整数 n1, n2 ,用一个空格分隔。 

第二行包含一个整数 m ,表示操作次数。 

第三行包含 m 个正整数 v1, v2, · · · , vm ,表示依次访问到的数据页的编号, 相邻整数之间使用一个空格分隔。

输出格式

输出两行。 

第一行包含若干个整数,相邻整数之间使用一个空格分隔,依次表示 q1 中 的数据页。 

第二行包含若干个整数,相邻整数之间使用一个空格分隔,依次表示 q2 中 的数据页。

样例输入

3 3
10
1 2 3 4 3 2 2 1 3 4

样例输出

4 3 2
1

提示

【样例说明】

                                                       

屏幕截图 2025-04-16 104717.png

【评测用例规模与约定】 

对于 20% 的评测用例,1 ≤ n1, n2 ≤ 10 ,1 ≤ m ≤ 10 ; 

对于 40% 的评测用例,1 ≤ n1, n2 ≤ 20 ,1 ≤ m ≤ 100 ; 

对于 60% 的评测用例,1 ≤ n1, n2 ≤ 100 ,1 ≤ m ≤ 1000 ; 

对于 80% 的评测用例,1 ≤ n1, n2 ≤ 103 , 1 ≤ m ≤ 104 ; 

对于所有评测用例,1 ≤ n1, n2 ≤ 104 ,1 ≤ m ≤ 105 ,0 ≤ vi ≤ 104 。

思路

入队出队这种可以用结构体来做,设两个结构体,代表两个队列,根据情况设置入队出队的操作

有新数据首先在两队列中查找,都不在的话就加入第二队,并删除多余元素;在第一队就进行队内调整,可以先删去对应元素,再在首位添加;在第二队就将对应元素移动到第一队,并将多出的元素移动到第二队,因为第二队的元素移动,所以一定处于不满状态

结构体很久没用了,很生疏,又因为结构体末尾的指针我不会用,所以就没设,而是用一个函数查找末尾元素


#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct QNode {
	ElemType data;
	struct QNode* next;
}QNode;
typedef struct Queue {
	struct QNode* front;
	ElemType length;
}Queue;

void InitQueue(Queue* Q, int n){
	Q->front = NULL;
	Q->length = n;//记录队列最大长度
}

int inQueue(int v, Queue* Q) {//检测数据在其中,如果有数据就同时删除
	if (Q->front == NULL)
		return 0;
	QNode* q = Q->front;
	if (q->data == v) {
		Q->front = q->next;
		return 1;
	}
		
	QNode* q2 = q->next;
	while (q2) {
		if (q2->data == v) {//同时删除数据,便于之后添加
			q->next = q2->next;
			free(q2);
			return 1;
		}
			
		q = q->next;
		q2 = q2->next;
	}
	return 0;
}
int QueueLen(Queue* Q) {//当前数据长度
	int length = 0;
	if (Q->front == NULL)
		return 0;
	QNode *q;
	q = Q->front;
	while (q) {
		length++;
		q = q->next;
	}
	return length;
}

void joinQueue(Queue* Q, int v) {//加入首位元素
	struct QNode* q = (struct QNode*)malloc(sizeof(struct QNode));
	q->data = v;
	q->next = Q->front;
	Q->front = q;
}
void deleteQueue(Queue* Q) {//删除末尾元素
	QNode *q1,*q2;
	q1 = Q->front;
	if (!q1->next) {
		Q->front = NULL;
		free(q1);
		return;
	}
	q2 = q1->next;
	while (q2&&q2->next) {
		q1 = q1->next;
		q2 = q2->next;
	}
	q1->next = NULL;
	free(q2);
}
void deletedQueueMid(Queue* Q, int v) {//删除其中元素
	QNode *q1,*q2;
	q1 = Q->front;
	if (q1->data == v) {
		Q->front = q1->next;
		free(q1);
		return;
	}
	q2 = q1->next;
	while (q2) {
		if (q2->data == v) {
			q1->next = q2->next;
			free(q2);
			return;
		}
			
		q1 = q1->next;
		q2 = q2->next;
	}

}
int findLost(Queue* Q) {//查找末尾元素
	QNode* q1=Q->front;
	int k = 0;
	while (q1) {
		k = q1->data;
		q1 = q1->next;
	}

	return k;

}
int main() {
	int n1, n2;
	long long m;
	int i,v;
	struct Queue* q1 = (struct Queue*)malloc(sizeof(struct Queue));
	struct Queue* q2 = (struct Queue*)malloc(sizeof(struct Queue));
	scanf("%d %d", &n1, &n2);
	InitQueue(q1, n1);
	InitQueue(q2, n2);
	scanf("%lld", &m);
	for (i = 0;i < m;i++) {
		scanf("%d", &v);
		int inQ1 = inQueue(v, q1);
		int inQ2 = inQueue(v, q2);
		if (!inQ1 && !inQ2) {//不在两表内
			joinQueue(q2, v);
			if (QueueLen(q2) > n2) {//数量过多,删除
				deleteQueue(q2);
			}
		}
		else if (inQ1) {//在第一层中
			joinQueue(q1, v);
		}
		else {//在第二层中
			joinQueue(q1, v);
			if (QueueLen(q1) > n1) {//超出空间
				int k = findLost(q1);//末尾元素
				deleteQueue(q1);
				joinQueue(q2, k);
			}
		}
	}
	QNode *q = q1->front;
	while (q) {
		printf("%d ", q->data);
		q = q->next;
	}
	printf("\n");

	q = q2->front;
	while (q) {
		printf("%d ", q->data);
		q = q->next;
	}
	printf("\n");
	return 0;
}

【蓝桥杯备赛】历年真题解答+知识点总结 CC150给出算法题五种解法 举例法:具体例子,到一般规则(公式符号化) 模式匹配法:相似问题,到现有问题(经典的变体) 简化推广法:从简化版,到复杂版(修改约束条件) 简单构造法:从n=1开始(递归过递推) 数据结构头脑风暴法:链表?数组?二叉树?堆?栈?队列?前缀和?树桩数组?区间树? ... 阅读详情

相关推荐

蓝桥杯算法题目练习

2022练习题 1161: 三值排序 题目描述 给一个长度为n的数组,其中数组各元素的值仅为1、2、3。 求排成升序的最少交换次数。 输入格式 第一行为正整数n,不超过1000。 接下来n行,每行一个整数表示数组元素。 输出格式 输出一个数字表示答案。 **思路:**记录排序后是1/2/3的区域,遍历原列表,如果不在自己对应的区域,则先去自己应该在的区域里面找,找到了则交换,找不到再从全局查找。 代码: if __name__ == "__main__": n = int(input())

qq_53651651的博客 2256

蓝桥杯基础题目合集C语言

蓝桥杯基础练习题

weixin_61936651的博客 4万+

第十六届蓝桥杯软件赛 C 组省赛 C++ 题解

本文是第十六届蓝桥杯软件赛C组省赛的C++题解,共包含8道题目: 数位倍数:暴力枚举1-202504,统计数位和是5倍数的数字个数 2025:统计1-20250412中数字包含至少1个0、2个2、1个5的数字个数 2025图形:找规律输出周期性"2025"图形 最短距离:贪心算法,排序后对应位置差的绝对值之和最小 冷热数据队列:使用哈希表和双向链表模拟数据队列操作 倒水:二分答案,检查能否使所有瓶子水量≥x 拼好数:贪心+分类讨论,统计6的个数并分组 登山:图论+并查集+单调栈,处理二维

2403_88695928的博客 1306

蓝桥杯C/C++程序设计 往届真题汇总(进阶篇)

1. 最短路2. 数字三角形3. 递增序列4. 杨辉三角形5. 跳跃6. 路径7. 迷宫8. 装饰珠9. 明码10. 字串分值11. 作物杂交12. 承压计算13. 全球变暖14. 直线15. 平面切分

Bit_Dong的博客 5万+

第十六届蓝桥杯大赛软件赛C/C++赛道题解

本篇文章会持续更新,后面会包含十六届C/C++的各组的省赛、国赛。有错误欢迎大家指出

odoaobo的博客 7059

Abaqus 气动软体抓取器:从超弹性材料建模到抓取力仿真全流程解析

本文详细解析了Abaqus在气动软体抓取器仿真中的应用全流程,涵盖超弹性材料建模、接触设置优化到抓取力仿真等关键环节。通过实战案例分享Yeoh模型参数拟合、不可伸展层建模技巧及收敛优化策略,帮助工程师高效解决有限元仿真中的常见问题,提升软体机器人研发效率。

weixin_28689193的博客 237

2025年第十六届蓝桥杯省赛C++ 研究生组真题

2025年第十六届蓝桥杯省赛C++ 研究生组真题 1.说明 2.题目A:数位倍数(5分) 3.题目B:IPv6(5分) 4.题目C:变换数组(10分) 5.题目D:最大数字(10分) 6.题目E:冷热数字队列(15分) 7.题目F:01串(15分) 8.题目G:甘蔗(20分) 9.题目H:原料采购(20分)

weixin_46560512的博客 4028

DSP28335 ADC模块实战:从寄存器配置到精准数据采集(附代码详解)

本文详细解析DSP28335的ADC模块配置与数据采集实战,涵盖寄存器设置、采样窗口优化、中断处理及代码实现。重点解决ADC精度问题,如采样窗口不足导致数据偏差,提供完整代码示例和调试技巧,助力工程师实现精准数据采集。

kkk56的博客 864

第十六届蓝桥杯省赛Java大学A组题解

2025蓝桥杯javaA组答案

jinrissq的博客 1933

【文献阅读笔记】之基于注意力机制的深度学习路面裂缝检测

中文,计算机辅助设计与图形学学报,第 32 卷 第 8 期,2020 年 8 月。 DOI: 10.3724/SP.J.1089.2020.18059 摘要: 为实现自动准确地检测路面裂缝, 提升路面裂缝检测效果, 提出了一种基于注意力机制的裂缝检测网络 (attention-based crack networks, ACNet). 该网络采用编码器-解码器网络构架, 编码器采用 ResNet34 为骨干网, 提取路面裂缝特征; 在编码器和解码器间加入基于注意力机制的特征模块(attention-b

qq_44785998的博客 7592

STM32F103跑LVGL,用DMA加速刷屏,800*480大屏也能丝滑

本文详细介绍了如何在STM32F103芯片上通过DMA加速和内存优化,实现800*480大屏的LVGL流畅运行。通过FSMC+DMA硬件架构优化、双缓冲机制和LVGL参数调优,显著提升了界面刷新率和响应速度,适用于嵌入式GUI开发中的高性能需求场景。

weixin_30357231的博客 376

【刷题】巨暴力的第十六届蓝桥杯大赛软件赛省赛C组真题个人整合题解

食用蓝桥杯真题中。

2401_86729824的博客 1141

天地图API避坑指南:从零开始实现地址搜索与坐标标记

本文是一份天地图API实战避坑指南,详细讲解了从申请密钥、初始化地图到实现地址搜索与坐标标记的全过程。针对开发中常见的坐标偏移、搜索建议不显示、事件监听失效等核心难题,提供了具体的解决方案和代码示例,帮助开发者高效、稳定地集成天地图服务。

weixin_29326909的博客 263

[蓝桥杯 2025 省 C/Java A/研究生组] 冷热数据队列 题解

冷热数据队列q可以看做由两个子队列组成:长度为n1​的热数据队列q1​和长度为n2​的冷数据队列q2​。当我们需要访问某个数据页ppqq1​q2​pq2​pqpq1​q1​q2​q1​q2​q1​q2​。

Gen_Jack的博客 721

【低空经济】低空无人驾驶航空器运行管理系统设计方案

低空无人驾驶航空器运行管理系统(以下简称“系统”)旨在为低空域内的无人驾驶航空器(UAV)提供高效、安全、智能的运行管理服务。系统通过集成先进的通信、导航、监控、数据处理和人工智能技术,实现对低空域内无人驾驶航空器的实时监控、动态调度、风险评估和应急响应,确保其在复杂空域环境中的安全运行。系统的核心功能包括空域管理、飞行计划审批、实时监控、冲突预警、应急管理和数据分析。空域管理模块负责划分和管理低空域资源,确保不同飞行任务之间的空域隔离和高效利用。

2502_92579126的博客 1140

C语言实现惯导系统的间接粗对准

间接粗对准方法具有更好的角晃动抗干扰能力,只是在短时间内线晃动抗干扰能力相对弱些,若适当延长粗对准时间(一般在分钟量级),间接粗对准方法往往都能够取得良好的效果。间接粗对准方法是一种非常实用的捷联惯导粗对准方法,得到了广泛的应用。在惯导系统进入工作前,需要进行初始对准,使得惯导系统与当地导航坐标系指向一致,便于惯导系统更好地进入工作状态。博主利用C语言实现了间接粗对准,间接粗对准较之解析粗对准更有优势。以上函数中使用的其他函数块,已在之前或之后的博客中给出。

十八与她的博客 789

第16届蓝桥杯c++省赛c组个人题解

偷偷吐槽:c组没人写题解吗,找不到题解啊。

2301_81019360的博客 1987

HyperLynx(十九)DDR(二)DDR的地址仿真

(5)设置水平标尺为2ns/div,垂直标尺为500mV/div,如果有必要,可以通过多次仿真,得到一个更加理想的结果。此外,还可以看到信号在高低电平切换时,反射波形基本趋于平缓,许多大的反射切换边缘已减小,这给了我们更大的定时裕量。如果这些DIMM是缓冲过的,则4个DIMM通道是可行的,但因为这是一个无缓冲DIMM,(20)在编辑传输线对话框中,选择“Values”选项卡,改变传输线长度为3in,具体设置如图所示,单击“确定”按钮。(17)为了增加电压摆幅,选择一个比原来的47Ω小的电阻。

小幽余生不加糖 4257

打卡信奥刷题(2139)用C++实现信奥 P12166 [蓝桥杯 2025 省 C/Java A/研究生组] 冷热数据队列

本文介绍了蓝桥杯2025省赛题目"冷热数据队列"的解决方案。该问题要求模拟一个由热数据队列(q1)和冷数据队列(q2)组成的系统,根据特定规则处理数据页访问请求。当访问新数据页时将其插入q2首部,访问已有数据页时将其移至q1首部,并在队列满时进行淘汰处理。作者提供了C++实现方案,使用双向链表和哈希表记录数据页位置,确保高效查询和移动操作。代码通过维护两个链表(q1和q2)及对应的位置映射,实现了题目要求的冷热数据管理功能,最后输出两个队列中的当前数据页。

Loge谈信奥--一个专注于信奥人的博客 1265

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

2025蓝桥杯省赛C/C++研究生组游记

至少半年没写算法题了,手生了不少,由于python写太多导致行末老是忘记打分号,printf老是忘记写f,for和if的括号也老是忘写,差点连&&和||都忘记了。题目都是回忆版本,可能有不准确的地方。代码如果有机会能拿到的话,会补充的。

crosnken的博客 3193

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2025蓝桥杯C++研究生组真题-上海市省赛

其中 bitCount(x) 表示数字 x 的二进制表示中 1 出现的次数,例如 bitCount(3)=2,因为 3 的二进制表示为 11,其中 1 出现了两次。其组成的最大的二进制数字为 11110,对应的十进制数字为 30。暴力解法:遍历所有数字,对于每个数字,202504,计算各个数位的和。输出一行,包含 n 个整数,相邻整数之间使用一个空格分隔,表示变换之后得到的数组 a。输入一个十进制数x,统计x的二进制数里面的1的个数。我们的目标是让这个二进制数的值最大,并输出这个二进制对应的十进制表示。

weixin_57253447的博客 1266

16届蓝桥杯省赛Java A 组

16届蓝桥杯省赛Java A 组 解析

要努力去发光,而不是被照亮~ 366

P12166 [蓝桥杯 2025 省 C/Java A/研究生组] 冷热数据队列

【代码】P12166 [蓝桥杯 2025 省 C/Java A/研究生组] 冷热数据队列。

Osako233的博客 56

冷热数据队列怎么破?哈希表+双向链表实现高效O(1)操作

在算法与数据结构中,哈希表和双向链表是两种基础但极具威力的结构。哈希表能以O(1)平均复杂度快速定位元素,双向链表则能在已知节点的情况下以O(1)完成插入和删除。将两者结合,可以构建出支撑LRU缓存淘汰、数据库缓冲池管理等经典场景的高性能数据结构。其核心原理,是通过哈希表建立“键到节点”的索引,再利用链表维护元素的访问顺序,从而在动态操作中避免昂贵的数组搬移。这一组合广泛应用于操作系统页面置换、Redis内存淘汰等真实系统。而在算法竞赛中,这类思想常被包装成“冷热数据队列”等题目,考察选手对底层结构的理解和

weixin_31364787的博客 44

蓝桥杯竞赛中的冷热数据队列设计与Java实现

冷热数据分离是计算机系统中常见的数据管理策略,其核心原理基于数据的访问局部性特征。通过分析数据访问频率,系统可以自动识别热数据(频繁访问)和冷数据(较少访问),从而优化存储访问效率。这种技术在缓存系统、数据库索引和内存管理中广泛应用。典型的实现方式包括双队列结构、优先级队列和链表+哈希表组合方案。以Java实现为例,可以利用LinkedList作为基础队列,配合LinkedHashMap构建热数据缓存,通过维护访问计数器实现冷热数据的动态调整。在算法竞赛如蓝桥杯中,这类问题常考察选手对数据结构的选择与优化能

weixin_31155097的博客 213

【蓝桥杯】2024年第15届真题题目

会发生反弹,每次反弹的入射角与反射角相等,因此小球会改变方向且保持速。这是一道结果填空的题,你只需要算出结果后提交即可。这是一道结果填空的题,你只需要算出结果后提交即可。然而小明偷偷学了魔法,可以降低一些山的高度。两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可。个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。个小数,在提交答案时只填写这个小数,填写多余的内容将无法得分。输出共一行,一个非负整数,表示两个队伍力量值之和的最小差距。请计算出力量值之和差距最小的挑选队伍的方式。

weixin_67972246的博客 2万+
上一篇: 蓝桥杯2025年第十六届省赛真题-变换数组(C语言)
下一篇: DNA(C语言)
Ehell
博客等级 码龄4年 23粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值