不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务。现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分的功能。

输入格式:

输入首先给出两个正整数NN(\le 10^5≤10​5​​)和KK(\le 500≤500)。其中KK是最低里程,即为照顾乘坐短程航班的会员,航空公司还会将航程低于KK公里的航班也按KK公里累积。随后NN行,每行给出一条飞行记录。飞行记录的输入格式为:18位身份证号码(空格)飞行里程。其中身份证号码由17位数字加最后一位校验码组成,校验码的取值范围为0~9和x共11个符号;飞行里程单位为公里,是(0, 15 000]区间内的整数。然后给出一个正整数MM(\le 10^5≤10​5​​),随后给出MM行查询人的身份证号码。

输出格式:

对每个查询人,给出其当前的里程累积值。如果该人不是会员,则输出No Info。每个查询结果占一行。

输入样例:

4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x

输出样例:

800
15000
1000
No Info

注意hash函数的选取,一开始我选取了后四位果断超时,选取了后五位即可AC,尽量让Hash函数取值接近数据最大值,这样能减少很多冲突。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define MAXN 10005
typedef long long LL;
/*
hash表
*/ typedef struct node
{
char id[];
LL miles;
struct node* next;
}*List;
typedef struct tb
{
LL Tablesize;
List *list;
}*Hashlist;
LL Hash(char key[],LL size)
{
LL tmp = ;
for(LL i=;i<;i++)
{
if(key[i]=='x')
tmp = (tmp*+)%size;
else
tmp = (tmp* + key[i]-'')%size;
}
return tmp;
}
LL NextPrim(LL x)
{
LL j;
for(LL i=x;;i++)
{
for(j=;j*j<=i;j++)
if(i%j==)
break;
if(j*j>i)
return i;
}
}
Hashlist Init(LL size)
{
Hashlist H = (Hashlist)malloc(sizeof(tb));
H->Tablesize = NextPrim(size);
H->list = (List*)malloc(sizeof(List)*H->Tablesize);
for(LL i=;i<H->Tablesize;i++)
{
H->list[i] = (List)malloc(sizeof(node));
H->list[i]->next = NULL;
}
return H;
}
List Find(char key[],Hashlist H)
{
List t = H->list[Hash(key,H->Tablesize)];
List p = t->next;
while(p!=NULL && strcmp(key,p->id))
p = p->next;
return p;
}
void Insert(char key[],LL miles,Hashlist H)
{
List t = H->list[Hash(key,H->Tablesize)];
List f = Find(key,H);
if(f==NULL)
{
List tmp = (List)malloc(sizeof(node));
tmp->miles = miles;
strcpy(tmp->id,key);
tmp->next = t->next;
t->next = tmp;
}
else
{
(f->miles) += miles;
}
} int main()
{
char id[];
LL tmp,n,m,k;
scanf("%lld%lld",&n,&k);
Hashlist H = Init(n);
for(LL i=;i<n;i++)
{
scanf("%s%lld",id,&tmp);
if(tmp<k) tmp = k;
Insert(id,tmp,H);
}
scanf("%lld",&m);
for(LL j=;j<m;j++)
{
scanf("%s",id);
List f = Find(id,H);
if(f==NULL)
printf("No Info\n");
else
printf("%lld\n",f->miles);
}
}
												

5-45 航空公司VIP客户查询 (25分) HASH的更多相关文章

  1. 7-13 航空公司VIP客户查询 (25 分)

    题意: 思路: 读完题目之后的第一思路就是用map将客户的id(string类型)与里程road(int类型)形成映射,然后直接用id查找添加里程或输出里程.但是400ms的限制妥妥的超时了.然后意识 ...

  2. 5-15 QQ帐户的申请与登陆 (25分) HASH

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数NN(\le 10^5≤10​5​​),随后给出NN行指令.每行指令的格 ...

  3. 5-14 电话聊天狂人 (25分) HASH

    给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤10​5​​),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...

  4. 12. The Biggest Safety Threat Facing Airlines 航空公司面临的最大安全威胁

    12. The Biggest Safety Threat Facing Airlines 航空公司面临的最大安全威胁 (1) The biggest safety threat facing air ...

  5. PATA1055 The World's Richest (25 分)

    1055 The World's Richest (25 分) Forbes magazine publishes every year its list of billionaires based ...

  6. PAT 甲级 1055 The World's Richest (25 分)(简单题,要用printf和scanf,否则超时,string 的输入输出要注意)

    1055 The World's Richest (25 分)   Forbes magazine publishes every year its list of billionaires base ...

  7. L2-001 紧急救援 (25 分)

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

  8. PAT 甲级 1006 Sign In and Sign Out (25)(25 分)

    1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...

  9. 1044 Shopping in Mars (25 分)

    1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay b ...

随机推荐

  1. 《Maven实战》(许晓斌)导读(读书笔记&第二次读后感)

    第一章 Maven简介 Maven是构建工具,但同时还是jar包管理工具.项目信息管理工具 与Make.Ant比较,更为先进 第二章 Maven的安装和配置 Windows和Unix上安装都很简单,下 ...

  2. 为什么前后端分离不利于seo

    搜索引擎的基础爬虫的原理就是抓取你的url,然后获取你的html源代码并解析. 而你的页面通常用了vue等js的数据绑定机制来展示页面数据,爬虫获取到的html是你的模型页面而不是最终数据的渲染页面, ...

  3. 洛谷P3366 【模板】最小生成树(Kruskal)

    题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...

  4. SQL 索引篇

    索引介绍: 1.索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 数据库索引好比是一本书前面的目录, SQL Server的B树结构 2.加快数据库的查询速 ...

  5. [C++ STL] map使用详解

    一.set介绍: Map由红黑树实现,其元素都是"键值/实值"所形成的一个对组(key/value pairs).每个元素有一个键,是排序准则的基础.每一个键只能出现一次,不允许重 ...

  6. 【洛谷2617_BZOJ1901】Dynamic Rankings(树套树)

    题目: 洛谷 2617 BZOJ 1901 是权限题,\(n=10^4\) ,内存 128 MB :洛谷 2617 \(n=10^5\) ,内存 1024 MB ,数据比较坑. 分析: 蒟蒻初学树套树 ...

  7. [转]深入ASP.NET MVC之二:路由模块如何工作

    本文转自:http://www.cnblogs.com/yinzixin/archive/2012/11/05/2754483.html 摘要: 上文分析了UrlRouting模块何时会被触发,本文重 ...

  8. dive into python:模块的导入和搜索文件路径的配置

    1.Python中导入模块:import sys:相当于Java中的导入包.类. 比如,我们导入sys模块,使用:import sys; 2.Python中调用函数的时候,会从默认配置的库文件夹中(s ...

  9. windows系统下的redis启动教程

    下载解压后配置redis.conf文件配置端口号和密码,打开poweshell命令,进入redis解压目录,使用.\redis-server.exe redis.conf 命令启动redis服务,再打 ...

  10. Tcl之Math

    expr is for Tcl to do math operations. It takes all of its arguments ("2 + 2" for example) ...