1069:查找学生的信息

  • 题目来源:

    2003清华大学计算机研究生机试真题

  • 题目描述:

    输入N个学生的信息,然后进行查询。

  • 输入:

    输入的第一行为N,即学生的个数(N<=1000),接下来的N行包括N个学生的信息,信息格式如下:
    01 李江 男 21
    02 刘唐 男 23
    03 张军 男 19
    04 王娜 女 19
    然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
    02
    03
    01
    04

  • 输出:

    输出M行,每行包括一个对应于查询的学生的信息。如果没有对应的学生信息,则输出“No Answer!”

  • 样例输入:

    4
    01 李江 男 21
    02 刘唐 男 23
    03 张军 男 19
    04 王娜 女 19
    5
    02
    03
    01
    04
    03

  • 样例输出:

    02 刘唐 男 23
    03 张军 男 19
    01 李江 男 21
    04 王娜 女 19
    03 张军 男 19

我们可以参考前面做过的题目,建立一个结构体存储信息,然后建立一个字符数组放要查找的学号,依次遍历与输入的比较看是否存在,如果存在就输出所有信息,否则到头也没有就输出“No Answer!”。

AC代码如下:

    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    struct stu
    {
        char no[100];
        char name[200];
        char sex[10];
        int age;
    }buf[1001];
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%s%s%s%d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
            }
            int t;
            scanf("%d",&t);
            char x[100];
            int j;
            for(int i=0;i<t;i++)
            {
                scanf("%s",x);
                for(j=0;j<n;j++)
                {
                    if(strcmp(buf[j].no,x)==0)
                    {
                        printf("%s %s %s %d\n",buf[j].no,buf[j].name,buf[j].sex,buf[j].age);
                        break;
                    }
                }
            if(j==n)
                printf("No Answer!\n");
            }
        }
        return 0;
    }
    /*
    4
    01 李江 男 21
    02 刘唐 男 23
    03 张军 男 19
    04 王娜 女 19
    5
    02
    03
    01
    04
    03
    */

为了降低时空复杂度我们可以采用二分查找来实现查找部分,具体的AC代码如下:

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>

    using namespace std;

    struct stu{
        char no[100];
        char name[100];
        int age;
        char sex[5];

        bool operator < (const stu & A) const {
        return strcmp(no,A.no)<0;
        }
    }buf[1000];

    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF){
            for(int i=0;i<n;i++){
                scanf("%s%s%s%d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
            }
            //按学号升序排列便于使用二分查找
            sort(buf,buf+n);
            int t;
            scanf("%d",&t);
            //保证查询次数为t
            while(t--!=0){
                int ans=-1;
                char x[30];
                scanf("%s",x);
                //进行二分查找
                int top=n-1,base=0;
                while(top>=base){
                    int mid=(top+base)/2;
                    int tmp=strcmp(buf[mid].no,x);
                    if(tmp==0){
                        ans=mid;
                        break;
                    }else if(tmp>0){
                        top=mid-1;
                    }else
                        base=mid+1;
                    }
                    if(ans==-1){
                        printf("No Answer!\n");
                }else
                printf("%s %s %s %d\n",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);
            }
        }
        return 0;
    }

注意:二分查找是建立在有序的前提下,故需要我们在查找前进行一次排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值