【九度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 日

posted @ 2017-02-27 19:30  负雪明烛  阅读(25)  评论(0编辑  收藏  举报