我是靠谱客的博主 开放小鸭子,最近开发中收集的这篇文章主要介绍7-15 航空公司VIP客户查询 (25 分),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

7-15 航空公司VIP客户查询 (25 分)

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

800
15000
1000
No Info
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#define maxn 100010
int head[maxn];
int coun=0;
typedef struct LNode{
char name[20];
int road;
int next;
}LNode;
LNode v[maxn];
int HashId(char *str){
int len=strlen(str);
long long sum=0;
for(int i=0;i<len;i++){
if(isdigit(str[i])) sum=sum*10+str[i]-'0';
else sum=sum*10+10;
}
return (int)(sum%100010);
}
void Add(char *str,int index,int m){
int flag=0;
for(int i=head[index];i!=-1;i=v[i].next)
if(strcmp(v[i].name,str)==0){
v[i].road+=m;
flag=1;
}
if(!flag){
strcpy(v[coun].name,str);
v[coun].road=m;
v[coun].next=head[index];
head[index]=coun;
coun++;
}//如果按照之前的方法会越界 ***需要更新head[index]** 只记录最后的coun
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
memset(head,-1,sizeof(head));
char str[20]; int m;
while(n--){
getchar();
scanf("%s %d",str,&m);
if(m<k) m=k;
int index=HashId(str);
Add(str,index,m);
}
int num;scanf("%d",&num);
while(num--){
getchar();
scanf("%s",str);
int id=HashId(str);
int t=0;
for(int i=head[id];i!=-1;i=v[i].next){
if(strcmp(v[i].name,str)==0){
printf("%dn",v[i].road);
t=1;
}
}
if(!t) printf("No Infon");
}
}
//1 500
//330106199010080419 499

还有一个比较啰嗦的但是思路比较清晰一点

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#define maxn 100010
int head[maxn];
int coun=0;
typedef struct LNode{
char name[20];
int road;
int next;
}LNode;
LNode v[maxn];
int HashId(char *str){
int len=strlen(str);
long long sum=0;
for(int i=0;i<len;i++){
if(isdigit(str[i])) sum=sum*10+str[i]-'0';
else sum=sum*10+10;
}
return (int)(sum%100010);
}
void Add(char *str,int index,int m){
//printf("head[index] : %dn",head[index]);
if(head[index]==-1){
//printf("no onen");
//说明该位置没有被任何人占用
strcpy(v[coun].name,str);
v[coun].road=m;
v[coun].next=-1;
head[index]=coun;
coun++;
}
else{
//说明发生了冲突 需要进行后移 或者road+=m
int flag=0;
for(int i=head[index];i!=-1;i=v[i].next){
if(strcmp(v[i].name,str)==0){
v[i].road+=m;
flag=1;
//printf("更新roadn");
}
}
if(!flag){
//需要后移添加
//printf("add road and nextn");
strcpy(v[coun].name,str);
v[coun].road=m;
v[coun].next=head[index];
head[index]=coun;
coun++;
}
}
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
memset(head,-1,sizeof(head));
//printf("head : %dn",head[80049]);
char str[20]; int m;
while(n--){
getchar();
scanf("%s %d",str,&m);
if(m<k) m=k;
int index=HashId(str);
//printf("index : %dn",index);
Add(str,index,m);
}
//
for(int i=0;i<coun;i++){
//
printf("name : %s,road : %d,next : %dn",v[i].name,v[i].road,v[i].next);
//
}
int num;scanf("%d",&num);
while(num--){
getchar();
scanf("%s",str);
int id=HashId(str);
int t=0;
for(int i=head[id];i!=-1;i=v[i].next){
if(strcmp(v[i].name,str)==0){
printf("%dn",v[i].road);
t=1;
}
}
if(!t) printf("No Infon");
}
}
//1 500
//330106199010080419 499

 

 

最后

以上就是开放小鸭子为你收集整理的7-15 航空公司VIP客户查询 (25 分)的全部内容,希望文章能够帮你解决7-15 航空公司VIP客户查询 (25 分)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部