news 2026/6/10 13:00:40

信息学奥赛一本通 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/6/10 14:19:59

开发者入门必看:Z-Image-Turbo UI界面快速部署与调用实操手册

开发者入门必看&#xff1a;Z-Image-Turbo UI界面快速部署与调用实操手册 你是不是也遇到过这样的情况&#xff1a;好不容易找到一个好用的图像生成模型&#xff0c;结果卡在部署环节——环境配不起来、端口打不开、界面进不去……最后只能放弃&#xff1f;别急&#xff0c;这…

作者头像 李华
网站建设 2026/6/10 14:20:43

YOLOv13损失函数三合一,分类定位更准确

YOLOv13损失函数三合一&#xff0c;分类定位更准确 在工业质检中漏检一颗微小螺丝、在自动驾驶场景里误判一个交通锥桶、在智慧零售系统中混淆两种相似商品——这些看似微小的误差&#xff0c;背后往往指向同一个技术瓶颈&#xff1a;传统目标检测模型的损失函数设计已难以支撑…

作者头像 李华
网站建设 2026/6/10 14:20:54

一句话生成适配图:Qwen-Image-Edit-2511改变内容生产方式

一句话生成适配图&#xff1a;Qwen-Image-Edit-2511改变内容生产方式 你有没有试过这样操作&#xff1a;把一张产品图拖进编辑器&#xff0c;输入“把背景换成科技蓝渐变&#xff0c;沙发换成米白绒布款&#xff0c;整体调成小红书风格”&#xff0c;回车——3秒后&#xff0c…

作者头像 李华
网站建设 2026/6/10 14:20:57

GPEN+facexlib人脸对齐集成:多模块协同部署步骤详解

GPENfacexlib人脸对齐集成&#xff1a;多模块协同部署步骤详解 你是否遇到过这样的情形&#xff1a;一张老照片里的人脸模糊不清&#xff0c;想修复却卡在第一步——人脸没对齐&#xff0c;后续所有增强都成了无本之木&#xff1f;或者在批量处理人像时&#xff0c;模型反复报…

作者头像 李华
网站建设 2026/6/10 13:21:07

ARM64栈帧布局深度剖析:函数调用机制完整指南

以下是对您提供的博文《ARM64栈帧布局深度剖析:函数调用机制完整指南》的 全面润色与重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、专业、有“人味”,像一位深耕ARM底层多年的嵌入式系统工程师在技术博客中娓娓道来; ✅ 摒弃所有模板化标题…

作者头像 李华
网站建设 2026/6/5 4:06:59

FSMN-VAD部署成本优化:按需计费GPU节省50%费用

FSMN-VAD部署成本优化&#xff1a;按需计费GPU节省50%费用 1. 为什么语音端点检测需要“省着用”GPU 你有没有试过部署一个语音处理服务&#xff0c;刚跑起来就发现GPU显存占了85%&#xff0c;风扇呼呼响&#xff0c;电费单却悄悄翻倍&#xff1f;这不是个别现象——很多团队…

作者头像 李华