HDU1234 开门人和关门人

问题链接HDU1234 开门人和关门人

问题简述:参见上述链接。

问题分析这个问题不是很困难,还是可以锻炼人处理输入输出的能力。

解决问题时,做两个排序,就可以找出开门的人和关门的人。程序中时间转换为整数(秒单位),以便比较排序。

程序说明这里同时给出C和C++的程序。

C和C++的排序库程序不一样,分别是qsort()和sort,参数不同,比较程序形式上也不一样。

一些细节还是需要注意的,C++程序中的比较函数,参数是常量和引用。

另外,在出来格式化输入方面,还是C语言有优势,所以C++程序中使用C语言的代码处理输入。

这两个程序都不是最佳解法,参见以下的链接。

参考链接HDU1234 开门人和关门人(解法二)其中的程序一边读入数据一边计算开门人和关门人,省去结构数组。

AC通过的C语言程序如下:

/* HDU1234 开门人和关门人 */

#include <stdio.h>
#include <stdlib.h>

struct node
{
    char name[20];
    int starttime;
    int endtime;
} record[1000];

int cmp1(const void * a, const void * b)
{
    struct node *x = (struct node *) a;
    struct node *y = (struct node *) b;
    return x->starttime - y->starttime;
}

int cmp2(const void * a, const void * b)
{
    struct node *x = (struct node *) a;
    struct node *y = (struct node *) b;
    return y->endtime - x->endtime;
}

int main(void)
{
    int n, m, i;
    int h, mi, s;

    // 读入总天数(测试组数)
    scanf("%d", &n);
    while(n--) {
        // 读入记录数
        scanf("%d", &m);
        // 读入各个记录
        for(i=0; i<m; i++) {
            scanf("%s %d:%d:%d", record[i].name, &h, &mi, &s);
            record[i].starttime = s + mi * 60 + h * 3600;
            scanf("%d:%d:%d", &h, &mi, &s);
            record[i].endtime = s + mi * 60 + h * 3600;
        }

        // 排序(按开门时间)
        qsort(record, m, sizeof(record[0]), cmp1);
        // 输出开门人名字
        printf("%s ",record[0].name);
        // 排序(按关门时间)
        qsort(record, m, sizeof(record[0]), cmp2);
        printf("%s\n",record[0].name);
    }

    return 0;
}

AC通过的C++语言程序如下:

/* HDU1234 开门人和关门人 */

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

struct node
{
    char name[20];
    int starttime;
    int endtime;
} record[1000];

bool cmp1(const node& a, const node& b)
{
    return a.starttime < b.starttime;
}

bool cmp2(const node& a, const node& b)
{
    return a.endtime > b.endtime;
}

int main()
{
    int n, m;
    int h, mi, s;

    // 读入总天数(测试组数)
    cin >> n;
    while(n--) {
        // 读入记录数
        cin >> m;

        // 读入各个记录
        for(int i=0; i<m; i++) {
            scanf("%s %d:%d:%d", record[i].name, &h, &mi, &s);
            record[i].starttime = s + mi * 60 + h * 3600;
            scanf("%d:%d:%d", &h, &mi, &s);
            record[i].endtime = s + mi * 60 + h * 3600;
        }

        // 排序(按开门时间)
        sort(record, record + m, cmp1);
        // 输出开门人名字
        cout << record[0].name << " ";
        // 排序(按关门时间)
        sort(record, record + m, cmp2);
        cout << record[0].name << endl;
    }

    return 0;
}


posted on 2016-06-20 05:20  海岛Blog  阅读(238)  评论(0编辑  收藏  举报

导航