九度OJ 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
思路:
应该先排序,然后批量查找效率会比较高。
我的代码是以前写的,多次直接查找效率不高,不推荐。
代码:
#include <stdio.h> #include <string.h> struct student { char num[10]; char name[100]; char sex[4]; int age; }; int main(void) { int n; struct student a[1000]; int i, j; int m; char num[10]; int index[10000]; while (scanf("%d", &n) != EOF) { for (i=0; i<n; i++) scanf("%s%s%s%d", a[i].num, a[i].name, a[i].sex, &(a[i].age)); //for (j=0; j<n; j++) // printf("%s %s %s %d\n", a[j].num, a[j].name, a[j].sex, a[j].age); scanf("%d", &m); for (i=0; i<m; i++) { scanf("%s", num); for (j=0; j<n; j++) { if (strcmp(a[j].num, num) == 0) { index[i] = j; break; } } if (j==n) index[i] = -1; } for (i=0; i<m; i++) { j = index[i]; if (j == -1) printf("No Answer!\n"); else printf("%s %s %s %d\n", a[j].num, a[j].name, a[j].sex, a[j].age); } } return 0; } /************************************************************** Problem: 1069 User: liangrx06 Language: C Result: Accepted Time:20 ms Memory:988 kb ****************************************************************/
编程算法爱好者。