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

输入样例:

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

代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
//用哈希函数处理客户身份证号,得到的相应id存入head[]数组里。
//head数组初始化为-1,
//建立一个链表p来存储客户信息(下标从0开始按顺序存储
//head数组用来存储相应id在p链表中存储的位置,同时也可表示该id的对应元素(值为-1时表示没有
//若存在冲突,则head[id]表示的是最后一个同id元素,p[m].next里存储上一元素的下标值
typedef long long ll;
const int maxn=1e5+7;//100007
int head[maxn];//函数初始化元素全为-1
struct Cus
{
    char name[20];
    int road;
    int next;
}p[maxn];
int GetId(char *str)
{
    ll res=0;//存储id的十进制数
    for(int i=0;i<strlen(str);i++)
    {
        if(str[i]>='0'&&str[i]<='9')
        //int isdigit(char c)函数检测c是否为0~9,头文件#include<ctype.h>
        {
            res=res*10+str[i]-'0';
        }
        else
        {
            res = res*10+10;
        }
    }
    return (int)(res%maxn);//哈希函数
}
int cnt=0;
void Add_Node(char *str,int id,int temp)
{
    int ok=1;
    for(int i=head[id];i!=-1;i=p[i].next)
    {
        if(strcmp(str,p[i].name)==0)//不需要添加,若是已登记用户,直接加里程数
        {
            p[i].road+=temp;
            ok=0;
        }
        //若为冲突
    }
    if(ok==1)//需要添加。如果该id无元素或发生了冲突
    {
        int i=0;
        p[cnt].road+=temp;
        for(i=0;str[i];i++)
        {
            p[cnt].name[i]=str[i];
        }
        p[cnt].name[i]='\0';//存入
        p[cnt].next=head[id];//若发生冲突,next存上一元素的值
        head[id]=cnt;//head[id]即为该id对应元素在p[]中的坐标值
        cnt++;
    }
}
int ToFind(char*str,int id)
{
    for(int i=head[id];i!=-1;i=p[i].next)
    //head[id]!=-1---head[id]不空
    {
        if(strcmp(str,p[i].name)==0)
        {
            cout<<p[i].road<<endl;
            return 1;
        }
    }
    return 0;
}
int main()
{
    char str[20];
    int n,k,temp;
    cin>>n>>k;
    memset(head,-1,sizeof(head));//初始化
    for(int i=0;i<n;i++)
    {
        cin>>str>>temp;
        if(temp<k)
            temp=k;
        int index=GetId(str);
        Add_Node(str,index,temp);
    }
    int m;
    cin>>m;
    for(int i=0;i<m;i++)
    {
        cin>>str;
        int index=GetId(str);
        if(!ToFind(str,index))
        {
            cout<<"No Info"<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值