题目来源:
2003清华大学计算机研究生机试真题
题目描述:
输入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
我们可以参考前面做过的题目,建立一个结构体存储信息,然后建立一个字符数组放要查找的学号,依次遍历与输入的比较看是否存在,如果存在就输出所有信息,否则到头也没有就输出“No Answer!”。
AC代码如下:
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct stu
{
char no[100];
char name[200];
char sex[10];
int age;
}buf[1001];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%s%s%s%d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
}
int t;
scanf("%d",&t);
char x[100];
int j;
for(int i=0;i<t;i++)
{
scanf("%s",x);
for(j=0;j<n;j++)
{
if(strcmp(buf[j].no,x)==0)
{
printf("%s %s %s %d\n",buf[j].no,buf[j].name,buf[j].sex,buf[j].age);
break;
}
}
if(j==n)
printf("No Answer!\n");
}
}
return 0;
}
/*
4
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
5
02
03
01
04
03
*/
为了降低时空复杂度我们可以采用二分查找来实现查找部分,具体的AC代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct stu{
char no[100];
char name[100];
int age;
char sex[5];
bool operator < (const stu & A) const {
return strcmp(no,A.no)<0;
}
}buf[1000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%s%s%s%d",buf[i].no,buf[i].name,buf[i].sex,&buf[i].age);
}
//按学号升序排列便于使用二分查找
sort(buf,buf+n);
int t;
scanf("%d",&t);
//保证查询次数为t
while(t--!=0){
int ans=-1;
char x[30];
scanf("%s",x);
//进行二分查找
int top=n-1,base=0;
while(top>=base){
int mid=(top+base)/2;
int tmp=strcmp(buf[mid].no,x);
if(tmp==0){
ans=mid;
break;
}else if(tmp>0){
top=mid-1;
}else
base=mid+1;
}
if(ans==-1){
printf("No Answer!\n");
}else
printf("%s %s %s %d\n",buf[ans].no,buf[ans].name,buf[ans].sex,buf[ans].age);
}
}
return 0;
}
注意:二分查找是建立在有序的前提下,故需要我们在查找前进行一次排序。