问题链接:HDU1234 开门人和关门人。
问题简述:参见上述链接。
问题分析:这个问题不是很困难,还是可以锻炼人处理输入输出的能力。
解决问题时,做两个排序,就可以找出开门的人和关门的人。程序中时间转换为整数(秒单位),以便比较排序。
程序说明:这里同时给出C和C++的程序。
C和C++的排序库程序不一样,分别是qsort()和sort,参数不同,比较程序形式上也不一样。
一些细节还是需要注意的,C++程序中的比较函数,参数是常量和引用。
另外,在出来格式化输入方面,还是C语言有优势,所以C++程序中使用C语言的代码处理输入。
这两个程序都不是最佳解法,参见以下的链接。
参考链接:HDU1234 开门人和关门人(解法二)。其中的程序一边读入数据一边计算开门人和关门人,省去结构数组。
AC通过的C语言程序如下:
/ HDU1234 开门人和关门人 /
#include
#include
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;
// 读入总天数(测试组//代码效果参考:http://www.lyjsj.net.cn/wx/art_22994.html
数)scanf("%d", &n);
while(n--) {
// 读入记录数
scanf("%d", &m);
// 读入各个记录
for(i=0; 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);
// 输//代码效果参考:http://www.lyjsj.net.cn/wz/art_22992.html
出开门人名字printf("%s ",record【0】.name);
// 排序(按关门时间)
qsort(record, m, sizeof(record【0】), cmp2);
printf("%s\n",record【0】.name);
}
return 0;
}
AC通过的C++语言程序如下:
/ HDU1234 开门人和关门人 /
#include
#include
#include
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.endtime;
}
int main()
{
int n, m;
int h, mi, s;
// 读入总天数(测试组数)
cin ] n;
while(n--) {
// 读入记录数
cin ] m;
// 读入各个记录
for(int i=0; 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 //代码效果参考:http://www.lyjsj.net.cn/wz/art_22990.html
60 + h 3600;}
// 排序(按开门时间)
sort(record, record + m, cmp1);
// 输出开门人名字
cout [ record【0】.name [ " ";
// 排序(按关门时间)
sort(record, record + m, cmp2);
cout [ record【0】.name [ endl;
}
return 0;
}