HDU1234 开门人和关门人【水题】

2024-04-09 00:08
文章标签 水题 开门 关门 hdu1234

本文主要是介绍HDU1234 开门人和关门人【水题】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开门人和关门人

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 开门人和关门人【水题】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886723

相关文章

uva 10055 uva 10071 uva 10300(水题两三道)

情歌两三首,水题两三道。 好久没敲代码了为暑假大作战热热身。 uva 10055 Hashmat the Brave Warrior 求俩数相减。 两个debug的地方,一个是longlong,一个是输入顺序。 代码: #include<stdio.h>int main(){long long a, b;//debugwhile(scanf("%lld%lld", &

Codeforces Round #182 (Div. 2)A(水题)

题目链接:http://codeforces.com/contest/302/problem/A 解题思路: 只要通过重新排列使区间内和为0即是1,否则是0. 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <complex>#include <cstdio>#inc

HDU 2064 汉诺塔III(水题)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目大意: 有三根杆,求把n个圆盘从左边移到右边,最少需要移动圆盘的次数。移动规则为大盘不能放在小盘上,比原始的汉诺塔题改变的地方是,只能通过中间的杆往左右两边的杆移动。 心得: 此题心得在题外,不在题内,初看此题,尼玛吓了一跳,好像很难的样子,手贱百度了一下,只注意到俩字“水题”,赶紧

【SGU】115. Calendar 水题= =

传送门:【SGU】115. Calendar 题目分析:2001年1月1号星期1,然后就没什么好说的了= = 代码如下: #include <map>#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespac

Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)

解题报告 意思就是说有n行柜子,放奖杯和奖牌,要求每行柜子要么全是奖杯要么全是奖牌,而且奖杯每行最多5个,奖牌最多10个。 直接把奖杯奖牌各自累加,分别出5和10,向上取整和N比较 #include <iostream>#include <cstdio>#include <cstring>#include <stdlib.h>#include <algorithm>

hdu 1013(水题)

题意:求一个数,各个数位相加,如果结果小于10则输出,否者递归进行数位相加。   #include <cstdio>#include <cstring>#include <string>#include <iostream>using namespace std;int result(int n){int sum = 0;while (n > 0){sum += n % 1

HDU 1008(水题)

题意:给一个数n,后跟着n个数,代表电梯要到的层数,如果是上升,则每层花费6分钟,下降每层划分4分钟,停着话费5分钟,求电梯总共花费多少时间。   #include <iostream>using namespace std;void main(){int n, m, t, total;while (cin >> n && n != 0){m = 0;total = 0;wh

HDU 1001(水题)

题意:输入n,求1~n之和。 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner s=new Scanner(System.in);int n=0;int sum;while(s.hasNextInt()){sum=0;n=s.nextInt();

HDU 1000 (水题)

题意:输入两个整数,求两个整数的和。   #include <cstdio>int main(){int a, b;while (scanf("%d%d", &a, &b) != EOF){printf("%d\n", a+b);}}

HDU 1128(水题)

题意:如题。 #include<stdio.h>#include<memory.h>#define N 1000001int visited[N];int Self(int n){int sum=n;while(n/10){sum+=n%10;n/=10;}sum+=n;return sum;}int main(){memset(visited,0,sizeof