开门人和关门人

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17861    Accepted Submission(s): 9056

Problem Description
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签
到、签离记录,请根据记录找出当天开门和关门的人。
Input
测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为

证件号码 签到时间 签离时间

其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

Output
对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
Sample Input
  
3 1 ME3021112225321 00:00:00 23:59:59 2 EE301218 08:05:35 20:56:35 MA301134 12:35:45 21:40:42 3 CS301111 15:30:28 17:00:10 SC3021234 08:00:00 11:25:25 CS301133 21:45:00 21:58:40
Sample Output
  
ME3021112225321 ME3021112225321 EE301218 MA301134 SC3021234 CS301133
Source
浙大计算机研究生复试上机考试-2005年


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

问题简述:参见上文。

问题分析

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

程序说明

  这个问题有两种解法:

  一是排序:  

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

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

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

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

  

  二是同时进行输入计算:

  程序一边读入数据一边计算开门人和关门人,省去结构数组,是最佳解法。

  程序中时间转换为整数(秒单位),以便比较。

AC通过的C语言程序如下(第2种方法):

/* HDU1234 开门人和关门人 */#include <stdio.h>
#include <string.h>int main()
{int n, m;int h, mi, s;char startname[20];char endname[20];int minstarttime;int maxendtime;char name[20];int starttime;int endtime;// 读入总天数(测试组数)scanf("%d", &n);while(n--) {// 读入记录数scanf("%d", &m);// 设置暂时的最小开门时间和最大关门时间minstarttime = 24 * 3600;maxendtime = 0;// 读入各个记录,并且求最小开门时间和最大关门时间for(int i=1; i<=m; i++) {scanf("%s %d:%d:%d", name, &h, &mi, &s);starttime = s + mi * 60 + h * 3600;if(starttime < minstarttime) {minstarttime = starttime;strcpy(startname, name);}scanf("%d:%d:%d", &h, &mi, &s);endtime = s + mi * 60 + h * 3600;if(endtime > maxendtime) {maxendtime = endtime;strcpy(endname, name);}}// 输出结果printf("%s %s\n", startname, endname);}return 0;
}

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;
}

HDU1234 开门人和关门人【水题】相关推荐

  1. HDU1234 开门人和关门人(解法二)【废除!!!】

    本文废除!!! 参考链接:HDU1234 开门人和关门人 问题链接:HDU1234 开门人和关门人. 问题简述:参见上述链接. 问题分析:之前所做的程序质量不高,所以重做该题的题解.上次使用了结构数组 ...

  2. 结构体+字符串比较大小(HDU1234开门人和关门人 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1234 Problem Description 每天第一个到机房的人要把门打开,最后一个离开的人要把门关 ...

  3. C - 开门人和关门人(结构体+sort)

    C - 开门人和关门人(结构体+sort) Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...

  4. HDU1234 开门人和关门人

    开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. 杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》...

    http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=3 1.3.1 FatMouse' Trade #include ...

  6. C - 开门人和关门人

    C - 开门人和关门人 #include<bits/stdc++.h> using namespace std; struct student{string id;string st;st ...

  7. 【杭电oj】-1234开门人关门人(快排,结构体)

    开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  8. hdu1234 开门人与关门人

    开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  9. I题 hdu 1234 开门人和关门人

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1234 开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)  ...

最新文章

  1. pdo mysql分页_php运用PDO连接数据库,实现分页效果
  2. Azkaban编译和安装模式
  3. CentOS x86_64系统手动释放内存
  4. jeecg3.5的一个bug
  5. Jquery第一章环境的搭建和介绍第一节
  6. adb小天才,小天才调试工具包下载
  7. IIS无法启动解决方案
  8. 摄氏度和开氏度的换算_摄氏度、华氏度和开氏度有何区别?
  9. Vue 项目中如何引入 iconfont 字体图标
  10. 郑强上任后,太原理工大学不断引援!
  11. 成都拓嘉启远:拼多多推广如何自己添加关键词
  12. C语言开发工具(编译器|IDE)推荐
  13. 环路补偿-一阶、二阶、运放补偿讲解及计算
  14. 现货黄金宝典——如何做突破行情
  15. oracle大型数据库系统在aix/unix上的实战详解 pdf,Oracle10g在AIX上的安装准备工作《Oracle大型数据库系统在AIX/unix上的实战详解》集中答疑40...
  16. 谈谈像素以及微信小程序的 rpx
  17. vue + svg 绘制水波纹、波浪动画效果
  18. LinkedList(链表)模仿先进先出或者先进后出
  19. 应该成为一名系统工程师么?
  20. 2020数学建模医疗和养老保障问题解决办法

热门文章

  1. LOJ#3124. 「CTS2019 | CTSC2019」氪金手游 容斥+DP
  2. 【白皮书】用于过程工业的PROFINET
  3. 基于S-FFT的相息图
  4. 【笔记】 C++中 方向键的输入
  5. 还 是 你 太 狠 心
  6. [STM32F1]STM32 低功耗待机模式与RTC周期唤醒
  7. 【Python小工具】若干图片合并生成动态图(.gif)
  8. uniapp实现下拉加载更多 u-loadmore
  9. 台式电脑 在哪找到计算机名,win7电脑的投屏功能在哪?教你找到!
  10. 测试适合眉形的软件_扫一扫测眉毛 测试适合眉型的软件