-
题目描述:
-
输入N个学生的信息,然后进行查询。
-
输入:
-
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:01 李江 男 2102 刘唐 男 2303 张军 男 1904 王娜 女 19然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:02030104
-
输出:
-
输出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[10] name[10]内存空间太小了,结果一直报WA的错误
操作符重载函数最后一定要记得加一个const不然编译不过
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
//此题目要注意的一点就是学号定义的类型是char而不是int
struct Student
{
public:
char no[100]; //最开始设置的no[10] name[10]内存空间太小了,结果一直报WA的错误
char name[100];
char sex[5];
int age;
bool operator<(const Student & y)const{ //操作符重载函数最后一定要记得加一个const不然编译不过
return strcmp(no,y.no)<0;
}
};
Student stu[1001];
int main()
{
int n;
int m;
while(scanf("%d",&n)!=EOF){
for(int i = 0;i <n;i++){
scanf("%s%s%s%d",stu[i].no,stu[i].name,stu[i].sex,&stu[i].age);
}
sort(stu,stu+n);
scanf("%d",&m);
while(m--){
char obj[100];
scanf("%s",obj);
//二分法查找 0到n-1
int star = 0;
int end = n-1;
int mid = (n-1)/2;
int ans = -1;
while(star <= end && ans == -1){
if(strcmp(stu[mid].no,obj)==0){
ans = mid;
}else if(strcmp(stu[mid].no,obj)<0){
star = mid+1;
}else{
end = mid-1;
}
mid = (star+end)/2;
}
if(ans != -1){
printf("%s %s %s %d\n",stu[ans].no,stu[ans].name,stu[ans].sex,stu[ans].age);
}else{
printf("No Answer!\n");
}
}
}
return 0;
}
PS:今晚去买各种文具,累的要死,要早早睡了~~,未来就在脚下,积累好点点滴滴。
注明---该博客为本人王道的学习笔记记录,博客中有些总结是引用王道机试一书的。