王道机考系列——查找
查找
1. 查找学生信息
题目描述:
输入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>
using namespace std;
struct Student {
char id[10];
char name[20];
char sex[5];
int age;
bool operator < (const Student & S) const {
return strcmp(id, S.id) < 0;
}
} buff[1001];
int BinarySearch(Student buff[], char sid[], int len) {
int low = 0;
int high = len - 1;
int mid = 0;
int ans = -1;
while(low <= high) {
mid = (low + high) / 2;
if (strcmp(buff[mid].id, sid) == 0) {
ans = mid;
break;
} else if (strcmp(buff[mid].id, sid) < 0) {
low = mid + 1;
high = len - 1;
} else {
low = 0;
high = mid - 1;
}
}
return ans;
}
int main() {
int n;
int m;
int temp = 0;
char sid[10];
while(scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%s%s%s%d", buff[i].id, buff[i].name, buff[i].sex, &buff[i].age);
}
sort(buff, buff+n);
for (int i = 0; i < n; i++) {
cout << buff[i].id << endl;
}
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%s", sid);
temp = BinarySearch(buff, sid, n);
if (temp > -1) {
cout << buff[temp].id << " " << buff[temp].name << " ";
cout << buff[temp].sex << " " << buff[temp].age << endl;
} else {
cout << "No Answer" << endl;
}
}
}
return 0;
}