http://ac.jobdu.com/problem.php?pid=1069
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:7855
解决:2124
- 题目描述:
-
输入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
- 答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7793-1-1.html
方法1:直接利用数组线性查找,时间复杂度O(n*m)
方法2:利用折半查找,时间复杂度O(nlogn (排序) + m*logn);
//方法1: #include<iostream> #include<cstdio> #include<cstring> using namespace std; struct info{ char number[1010]; char name[1010]; char sex[5]; int age; }buf[1010]; int main() { int n,m,i,j; while(scanf("%d",&n)!=EOF){ memset(buf,0,sizeof(buf)); for(i=1;i<=n;i++){ scanf("%s %s %s %d",buf[i].number,buf[i].name,buf[i].sex,&buf[i].age); } scanf("%d",&m); char x[1010]; for(i=1;i<=m;i++){ scanf("%s",x); for(j=1;j<=n;j++){ if(strcmp(x,buf[j].number)==0){ printf("%s %s %s %d\n",buf[j].number,buf[j].name,buf[j].sex,buf[j].age); break; } } if(j==n+1){ printf("No Answer!\n"); } } } return 0; } //方法2 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Student{ char no[100]; char name[100]; int age; char sex[5]; bool operator < (const Student & A) const{ return strcmp(no,A.no)<0; } }buf[1000]; int main() { int n,i; while(scanf("%d",&n)!=EOF){ for(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); 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; }
时间: 2024-10-13 20:13:20