计算机机试题:二分查找题

题目描述:

 输入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


代码如下:

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

using namespace std;
struct Student
{
    char no[100];
    char name[100];
    char sex[5];
    int age;
    bool operator < (const Student & 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);
        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;
}
可以看到前面用到了之前学过的sort函数,因为二分查找思想就是先进行排序,再进行查找。注意二分查找时边界是怎么划分的。

猜你喜欢

转载自blog.csdn.net/xckkcxxck/article/details/80845856