当前位置: 首页 > news >正文

信息学奥赛一本通 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;}
http://www.jsqmd.com/news/296782/

相关文章:

  • 高速信号完整性视角下的USB3.0传输速度调优方案
  • Qwen-Image-Layered新手指南:从安装到运行全流程解析
  • YOLOv13损失函数三合一,分类定位更准确
  • 2024年AI语音应用趋势:Emotion2Vec+ Large开源模型部署入门必看
  • TurboDiffusion影视预演应用:分镜自动可视化生成实战
  • 测试开机启动脚本镜像使用全攻略,收藏备用
  • 科研党福音!PyTorch通用镜像助力论文复现实验
  • 小白也能用!Qwen-Image-Layered图层拆分实战教程
  • 如何保证输出质量?unet 1024分辨率最佳实践
  • FSMN VAD云服务部署:AWS/Aliyun实例配置推荐
  • 一键启动YOLOv13,本地化服务让部署更高效
  • 对防火墙进行认证配置
  • 亲测gpt-oss-20b-WEBUI镜像:AI对话机器人部署全过程分享
  • GPEN与Photoshop插件集成:创意设计工作流优化
  • 下一代Embedding模型展望:Qwen3技术路线实战解读
  • 新手必看:Qwen3-Embedding-0.6B安装与调用全解析
  • USB2.0传输速度波动问题的示波器诊断方法:从零实现
  • 5分钟上手Open-AutoGLM:手机AI助手一键部署指南
  • 长文本实体识别内存不足?Qwen3-0.6B滑动窗口解法
  • AI内容审核新方案:SenseVoiceSmall笑声/掌声识别部署教程
  • 复杂背景人像抠图难?cv_unet_image-matting高阶参数优化指南
  • YOLOv9单卡训练优化案例:batch size调参实测效果
  • 解决Intel HAXM required报错:系统学习指南
  • FSMN-VAD部署成本优化:按需计费GPU节省50%费用
  • 5个开源图像增强模型部署教程:GPEN免配置镜像快速上手
  • 离线也能用!FSMN-VAD保护隐私的本地化部署优势
  • 麦克风直连测试,FSMN-VAD实时反馈语音段
  • 2026年热门的铣型衣柜拉手/极简衣柜拉手厂家最新TOP排行榜
  • 嵌入式HMI系统中I2C地址冲突的完整示例
  • 2026年靠谱的弹性菱花纹篮球场/篮球场高性价比推荐榜