news 2026/4/21 20:13:47

信息学奥赛一本通 1463:门票

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信息学奥赛一本通 1463:门票

【题目链接】

ybt 1463:门票

【题目考点】

1. 哈希表

相关知识见:【模板:哈希表】信息学奥赛一本通 1456:【例题2】图书管理

【解题思路】

解法1:链地址法实现哈希表

数据范围限制为65536 K B 65536KB65536KB
哈希表中最多可能保存2 ∗ 10 6 2*10^62106个元素,平均每个元素占用内存65536 ∗ 1024 / ( 2 ∗ 10 6 ) ≈ 33 B 65536*1024/(2*10^6)\approx 33B655361024/(2106)33B
使用STL中的unordered_set类,内存开销比较大,当存储元素个数达到2 ∗ 10 6 2*10^62106时,容易发生内存超限。
因此本题必须手动实现哈希表。
开放地址法对内存空间需求较大,需要保证负载因子较小(一般为0.7)才可以降低哈希冲突的概率,因此表长会比存储的元素数量更大,有很多空间不能保存数据,对空间需求较高。
而链地址法的负载因子可以大于1,对内存空间需求相对较小,较为灵活。
参考【模板:哈希表】信息学奥赛一本通 1456:【例题2】图书管理中解法2可以以链地址法实现哈希表。
可以选择将哈希表写成类,或只是声明全局数组和函数来实现。

本题给定了初值a 0 = 1 a_0=1a0=1,以及递推公式( A ⋅ a i + a i m o d B ) m o d C (A\cdot a_i+a_i\bmod B)\bmod C(Aai+aimodB)modC,想要求出第一次出现重复项的编号。即当求出的值为a i a_iai时,如果a i a_iai在先前已经出现过,就输出i ii
如果答案超过2 ∗ 10 6 2*10^62106,就输出-1。
我们可以根据a aa序列的初始值和递推式,依次递推求出a aa序列的每一项,设其中的一项为d dd。注意A ⋅ a i A\cdot a_iAai这一步要在long long类型下进行计算。
当求出a i = d a_i=dai=d时,首先在哈希表中查找是否存在d dd

  • 如果哈希表中存在d dd,则输出i ii,结束程序。
  • 如果哈希表中不存在d dd,则将d dd插入哈希表。

循环次数为2 ∗ 10 6 2*10^62106,如果跳出了循环,则输出-1。

【题解代码】

解法1:链地址法实现哈希表

  • 写法1:写全局数组和函数实现哈希表,链表中结点地址为int类型
#include<iostream>#include<algorithm>usingnamespacestd;#defineN2000003structNode{intval;intnext;}node[N];intp,data[N];//data[i]:哈希值为i的单链表的第一个结点的地址intHash(intkey){returnkey%N;}voidinsert(intkey){inth=Hash(key),np=++p;node[np].val=key;node[np].next=data[h];data[h]=np;}intcount(intkey){inth=Hash(key);for(inti=data[h];i!=0;i=node[i].next)if(node[i].val==key)return1;return0;}intmain(){inta,b,c,d=1;cin>>a>>b>>c;insert(d);for(inti=1;i<=2000000;++i){d=((longlong)a*d+d%b)%c;if(count(d)==1){cout<<i;return0;}elseinsert(d);}cout<<-1;return0;}
  • 写法2:实现HashSet类,链表中结点地址为Node*类型
#include<bits/stdc++.h>usingnamespacestd;#defineN2000003structHash{unsignedoperator()(intkey){returnkey%N;}};template<classT,classHashFunc>structHashSet//开散列{structNode{T key;Node*next=nullptr;}node[N],*p=node,*data[N]={};HashFunc hash;voidinsert(T key){//头插法if(count(key)==1)//如果哈希表中已经存在key,则不插入return;inth=hash(key);Node*np=++p;np->key=key;;np->next=data[h];data[h]=np;}intcount(T key)//获取关键字key的个数{inth=hash(key);for(Node*i=data[h];i!=nullptr;i=i->next)if(i->key==key)return1;return0;}};HashSet<int,Hash>hs;intmain(){inta,b,c,d=1;cin>>a>>b>>c;hs.insert(d);for(inti=1;i<=2000000;++i){d=((longlong)a*d+d%b)%c;if(hs.count(d)==1){cout<<i;return0;}elsehs.insert(d);}cout<<-1;return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 8:16:01

YOLOv12镜像真实体验:训练更稳、显存更低

YOLOv12镜像真实体验&#xff1a;训练更稳、显存更低 在目标检测工程落地的实践中&#xff0c;一个反复出现的困局正被悄然打破&#xff1a;当我们在论文里看到惊艳的mAP数字&#xff0c;在GitHub上clone下最新模型代码&#xff0c;满怀期待地执行train.py——却在第3行就卡在…

作者头像 李华
网站建设 2026/4/18 5:21:58

YOLOE预测结果可视化,Mask分割效果清晰可见

YOLOE预测结果可视化&#xff0c;Mask分割效果清晰可见 1. 为什么YOLOE的可视化效果值得特别关注 你有没有试过用其他分割模型跑完一张图&#xff0c;结果只看到一堆框和模糊的轮廓&#xff1f;或者明明标注了精细的mask&#xff0c;可视化时却像隔着一层毛玻璃——边缘发虚、…

作者头像 李华
网站建设 2026/4/18 8:29:10

开发者效率工具:FSMN-VAD脚本自动化部署实战推荐

开发者效率工具&#xff1a;FSMN-VAD脚本自动化部署实战推荐 1. FSMN-VAD 离线语音端点检测控制台 你是否还在为处理长段录音时手动切分语音片段而烦恼&#xff1f;有没有一种方法&#xff0c;能自动把你说的每一段话精准地“圈”出来&#xff0c;同时把中间的静音、停顿统统…

作者头像 李华
网站建设 2026/4/18 5:25:42

VHDL课程设计大作业:多路复用器设计操作指南

以下是对您提供的博文《VHDL课程设计大作业:多路复用器设计技术深度解析》的 全面润色与专业升级版 。本次优化严格遵循您的核心要求: ✅ 彻底去除AI痕迹 :全文以一位有10年FPGA教学+5年工业界验证经验的工程师口吻重写,穿插真实课堂反馈、学生常见错误截图级描述、综…

作者头像 李华
网站建设 2026/4/18 8:01:13

5分钟上手Open-AutoGLM:手机AI助手一键部署指南

5分钟上手Open-AutoGLM&#xff1a;手机AI助手一键部署指南 你有没有想过&#xff0c;对着手机说一句“帮我订明天上午10点去上海虹桥的高铁票”&#xff0c;手机就自动打开12306、登录账号、筛选车次、完成下单&#xff1f;这不是科幻电影——Open-AutoGLM 已经让这件事在真实…

作者头像 李华
网站建设 2026/4/18 7:54:54

一键启动YOLOv13,本地化服务让部署更高效

一键启动YOLOv13&#xff0c;本地化服务让部署更高效 你是否经历过这样的场景&#xff1a;刚下载完YOLOv13的代码仓库&#xff0c;却卡在pip install -r requirements.txt上整整二十分钟&#xff1f;明明显卡是RTX 4090&#xff0c;训练脚本却报错“CUDA out of memory”&…

作者头像 李华