机试指南练习总结第二章
机试指南练习总结第二章-查找
例题2.10:查找学生信息
题目描述
输入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!”
示例1
输入:
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 <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#define MAXSIZE 10
using namespace std;
struct student{
char id[10];
char name[MAXSIZE];
char sex[2];
int age;
bool operator < (const student & A) const{
return strcmp(id, A.id) < 0;
}
}buf[1001];
int midSearch(char* tid, int n);
int main()
{
int n,m,i;
char tid[10];
while(scanf("%d", &n) != EOF){
for(i=0; i<n; i++){
scanf("%s %s %s %d", buf[i].id, buf[i].name, buf[i].sex, &buf[i].age);
}
sort(buf, buf+n);
scanf("%d", &m);
int answer;
for(i=0; i<m; i++){
scanf("%s", tid);
answer = midSearch(tid, n);
if(answer == -1){
printf("No Answer!\n");
}else{
printf("%s %s %s %d\n", buf[answer].id, buf[answer].name, buf[answer].sex, buf[answer].age);
}
}
}
return 0;
}
int midSearch(char* tid, int n){
int low = 0;
int high = n-1;
int mid;
while(low <= high){
mid = (low + high)/2;
if(strcmp(buf