【九度OJ】题目1069:查找学生信息 解题报告

【九度OJ】题目1069:查找学生信息 解题报告

标签(空格分隔): 九度OJ


[LeetCode]

http://ac.jobdu.com/problem.php?pid=1069

题目描述:

输入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

Ways

查找题。

按照书上的说法,这个运算量级在千万量级,应该用高速的查找方法。按照书上的说法,应该用二分。

可是我用了sort之后,感觉没必要用二分也能AC,试了下果然行。这个方法应该直接不用sort也能解决。

同时注意一下为什么刚开始一直AC不了,因为我把name和sex的空间开的太小了。这就长个教训,空间给的很足够,只管用就是,别精打细算。

#include <stdio.h>
#include <algorithm>
#include <string.h> using namespace std; struct student {
char num[100];
char name[300];
char sex[20];
int age; bool operator<(const student &A) const {
return strcmp(num, A.num) < 0;
}
} students[1001]; int main() { int n;
int m;
char temp[1000]; while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%s%s%s%d", students[i].num,
students[i].name, students[i].sex, &students[i].age);
} sort(students, students + n); scanf("%d", &m); int j;
for (int i = 0; i < m; i++) {
scanf("%s", temp);
for (j = 0; j < n; j++) {
if (strcmp(temp, students[j].num) == 0) {
printf("%s %s %s %d\n", students[j].num,
students[j].name, students[j].sex, students[j].age);
break;
}
}
if (j == n)
printf("No Answer!\n");
} }
return 0;
}

把上面的方法简化,也能在同样的20ms内解决。而题目的要求是1000ms,差得远呢。所以以后这样的题可以先用笨方法试一试。

#include <stdio.h>
#include <algorithm>
#include <string.h> using namespace std; struct student {
char num[100];
char name[300];
char sex[20];
int age; } students[1001]; int main() { int n;
int m;
char temp[1000]; while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%s%s%s%d", students[i].num, students[i].name, students[i].sex, &students[i].age);
} scanf("%d", &m); int j;
for (int i = 0; i < m; i++) {
scanf("%s", temp);
for (j = 0; j < n; j++) {
if (strcmp(temp, students[j].num) == 0) {
printf("%s %s %s %d\n", students[j].num, students[j].name, students[j].sex, students[j].age);
break;
}
}
if (j == n)
printf("No Answer!\n");
} }
return 0;
}

挑战下自己,使用二分进行解决。手写了一下二分,运行时间依然是20ms,感觉很无语。

#include <stdio.h>
#include <algorithm>
#include <string.h> using namespace std; struct student {
char num[100];
char name[300];
char sex[20];
int age; bool operator<(const student &A) const {
return strcmp(num, A.num) < 0;
}
} students[1001]; int main() { int n;
int m;
char temp[1000]; while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%s%s%s%d",
students[i].num, students[i].name,
students[i].sex, &students[i].age);
} sort(students, students + n); scanf("%d", &m); for (int i = 0; i < m; i++) {
scanf("%s", temp); int start = 0;
int end = n - 1;
int mid;
int answer = -1;
while (start <= end) {
mid = (start + end) / 2;
int cmp = strcmp(temp, students[mid].num);
if (cmp == 0) {
answer = mid;
break;
} else if (cmp < 0) {
end = mid - 1;
} else {
start = mid + 1;
}
}
if (answer == -1) {
printf("No Answer!\n");
} else { printf("%s %s %s %d\n",
students[answer].num, students[answer].name,
students[answer].sex, students[answer].age);
} } }
return 0;
}

Date

2017 年 2 月 27 日

上一篇:如何使用chown?


下一篇:python的时间模块