1 #include <iostream>
2 #include <algorithm>
3 #include <string.h>
4 #include <string>
5 #include <stdio.h>
6 #include <iomanip>
7 using namespace std;
8 /*
9 题目:查找学生信息
10 用时:tomato *
11 思路:二分法(序号是有序的)
12 为什么不能用普通的查找方法:时间复杂度o(m*n):学生个数*需要查找的次数
13 问题:strlen比较的时候总相反,猜想是因为char类型没有初始化的缘故
14 解决:最后发现因为没有sort排序的缘故,为什么一定要排序呢?????
15 难点:重载大于运算符运用在sort中,看c++的书
16
17
18 */
19 struct Student
20 {
21 char num[5];
22 char name[10];
23 char gender[5];
24 int age;
25 bool operator < (const Student & A) const{
26 return strcmp(num,A.num)<0;
27 }
28 }stu[1001];
29
30 int binarySearch(char x[],int n)
31 {
32 // 在stu中根据二分法查找number x
33 int low = 0,high = n-1;
34 char temp[5];
35 while ( low <= high )
36 {
37 int mid = ( low + high )/2;
38 // cout << "mid num:" << stu[mid].num <<endl;
39 // strcpy(temp,stu[mid].num);
40 if (strcmp(stu[mid].num , x)>0 )
41 {
42 // x比中间小,区间变成左边
43 high = mid -1;
44 }
45 if (strcmp( stu[mid].num , x)<0)
46 {
47 low = mid + 1;
48 }
49 if (strcmp (stu[mid].num , x ) == 0)
50 return mid;
51
52 }
53 return -1;
54 }
55
56 int main()
57 {
58
59 int n;
60 int m;
61 char x[5];
62
63 while (cin>>n)
64 {
65 for (int i=0;i<n;i++)
66 {
67 scanf("%s %s %s %d",&stu[i].num,&stu[i].name,&stu[i].gender,&stu[i].age);
68 }
69 sort(stu,stu+n);
70 cin >> m;
71 for (int i=0;i<n;i++)
72 cout <<stu[i].num<<' '<<stu[i].name<<' '<<stu[i].gender<<' '<<stu[i].age<<endl;
73
74 for (int i=0 ; i<m ; i++)
75 {
76 cin>>x;
77 int result_i = binarySearch(x,n);
78 if (result_i == -1)
79 cout<<"No Answer!"<<endl;
80 else
81 cout <<stu[result_i].num<<' '<<stu[result_i].name<<' '<<stu[result_i].gender<<' '<<stu[result_i].age<<endl;
82 }
83 }
84
85
86
87 return 0;
88 }