news 2026/5/11 3:33:31

信息学奥赛一本通 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/27 20:49:35

全文检索响应加速指南:es数据库配置调优

以下是对您提供的博文《全文检索响应加速指南:Elasticsearch 数据库配置调优深度解析》的 全面润色与专业升级版 。本次优化严格遵循您的核心要求: ✅ 彻底去除AI腔与模板化表达 (如“本文将从…几个方面阐述”、“综上所述”等) ✅ 打破章节割裂感,以真实工程脉络…

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

8051 PWM波形生成:Keil C51从零实现教程

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。整体风格已全面转向 真实工程师视角的实战笔记体 ,摒弃模板化表达、学术腔与AI痕迹,强化逻辑连贯性、教学节奏感与工程现场感。全文无“引言/概述/总结”等程式化标题,所有知识点自然嵌套于问题驱动的叙…

作者头像 李华
网站建设 2026/5/10 8:58:12

零基础也能用!YOLOv9官方版镜像快速部署实战指南

零基础也能用&#xff01;YOLOv9官方版镜像快速部署实战指南 你是不是也经历过这样的场景&#xff1a;刚下载完YOLOv9代码&#xff0c;还没开始跑模型&#xff0c;就卡在了CUDA版本不匹配、PyTorch装不上、OpenCV报错、环境依赖冲突……一上午过去&#xff0c;连第一张检测图都…

作者头像 李华
网站建设 2026/5/8 22:01:06

对防火墙进行认证配置

目前有一防火墙连接着外网环境&#xff0c;企业内部网络以及服务器网络&#xff0c;先对其进行相关认证配置以及安全策略的配置&#xff0c;网络拓扑图如下所示。一、基础配置1、对交换机SW2和防火墙的接口以及基本设备的IP进行配置设备接口VLAN接口类型SW2GE0/0/2VLAN 10Acces…

作者头像 李华
网站建设 2026/5/6 11:20:58

YOLOv9单卡训练优化案例:batch size调参实测效果

YOLOv9单卡训练优化案例&#xff1a;batch size调参实测效果 在实际部署YOLOv9模型时&#xff0c;很多开发者会遇到一个现实问题&#xff1a;显存有限&#xff0c;但又希望训练效率尽可能高。特别是使用单张消费级显卡&#xff08;如RTX 3090/4090&#xff09;时&#xff0c;b…

作者头像 李华
网站建设 2026/4/29 12:28:01

动手试了Qwen3-1.7B,边缘设备跑大模型真香了

动手试了Qwen3-1.7B&#xff0c;边缘设备跑大模型真香了 1. 开场&#xff1a;树莓派上跑出“思考过程”的那一刻&#xff0c;我信了轻量化大模型 你有没有试过在树莓派5上&#xff0c;让一个大模型一边推理一边告诉你它怎么想的&#xff1f;不是云端调用&#xff0c;不是模拟…

作者头像 李华