原题地址:http://ac.jobdu.com/problem.php?pid=1069
题目描述:
输入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
-
来源:
本题是查找里面最基础的水题了,复习了一下复杂度为O(logn)的二分查找。
AC代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#define MAXN 1001
using namespace std;
typedef struct node
{
string id,name,sex; //id格式是字符串
int age;
bool operator < (const node & A) const //学号升序,重载小于
{
return id < A.id;
}
}STUDENT;
STUDENT s[MAXN];
int N;
int binary_search(const string &num) //二分搜索匹配id
{
int l=0, r=N-1, mid, ans = -1;
while (l<=r)
{
mid = (l+r)/2;
if (s[mid].id == num)
{
ans = mid;
break;
}
if (num < s[mid].id) r = mid-1;
else l = mid+1;
}
return ans;
}
int main()
{
int M, index;
string num;
while (cin >> N)
{
for (int i = 0; i < N; ++i)
cin >> s[i].id >> s[i].name >> s[i].sex >> s[i].age;
sort(s, s+N);
cin >> M;
while (M--)
{
cin >> num;
index = binary_search(num);
if (index != -1)
cout << s[index].id << ' ' << s[index].name << ' ' << s[index].sex << ' ' << s[index].age << endl;
else cout << "No Answer!" << endl;
}
}
return 0;
}
内存占用:1560Kb 耗时:170ms
算法复杂度: O(logn)