开门人和关门人(hdu1234字符串模拟题)

本文介绍了一种通过遍历结构体数组来找出最早开始和最晚结束时间的方法,并提供了一个简化版本使用strcmp函数实现相同功能的示例。

题意:给你n个人的姓名和他们开始时间和结束时间,找到最早开始的和最晚结束的

思路:结构体遍历找到最大值和最小值,保存下表

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct ntime
{
	int hh;
	int ff;
	int ss;
};
struct student
{
	char name[1000];
	ntime t;
	ntime t2;
}s[10000];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		memset(s,'\0',sizeof(s));
		scanf("%d",&n);
		int i;
		for(i = 0; i < n; i++)
		{
			scanf("%s",s[i].name);
			scanf("%d:%d:%d",&s[i].t.hh,&s[i].t.ff,&s[i].t.ss);
			scanf("%d:%d:%d",&s[i].t2.hh,&s[i].t2.ff,&s[i].t2.ss);
		}
		ntime Max,Min;
		Max.hh = -1,Max.ff = -1,Max.ss = -1;
		Min.hh = 100,Min.ff = 100,Min.ss = 100;
		int fMax = 0,fMin = 0;
		for(i = 0; i < n; i++)
		{
			if(Max.hh < s[i].t2.hh)
			{
				Max.hh = s[i].t2.hh;
				Max.ff= s[i].t2.ff;
				Max.ss = s[i].t2.ss;fMax = i;
			}
			else if(Max.hh == s[i].t2.hh)
			{
				if(Max.ff < s[i].t2.ff)
				{
						Max.hh = s[i].t2.hh;
						Max.ff= s[i].t2.ff;
						Max.ss = s[i].t2.ss;fMax = i;
				}
				else if(Max.ff == s[i].t2.ff)
				{
					if(Max.ss < s[i].t2.ss)
					{
						Max.hh = s[i].t2.hh;
						Max.ff= s[i].t2.ff;
						Max.ss = s[i].t2.ss;fMax = i;
					}
				}
			}
		//	printf("%d %d %d\n",Min.hh,Min.ff,Min.ss);
			if(Min.hh > s[i].t.hh)
			{
				Min.hh = s[i].t.hh;
				Min.ff= s[i].t.ff;
				Min.ss = s[i].t.ss;fMin = i;
			}
			else if(Min.hh == s[i].t.hh)
			{
				if(Min.ff > s[i].t.ff)
				{
						Min.hh = s[i].t.hh;
						Min.ff= s[i].t.ff;
						Min.ss = s[i].t.ss;fMin = i;
				}
				else if(Min.ff == s[i].t.ff)
				{
					if(Min.ss > s[i].t.ss)
					{
						Min.hh = s[i].t.hh;
						Min.ff= s[i].t.ff;
						Min.ss = s[i].t.ss;fMin = i;
					}
				}
			}
		}
		printf("%s %s\n",s[fMin].name,s[fMax].name);
	}
	return 0;
}

有一种简便的方法就是用strcmp函数

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct student
{
	char name[20];
	char start[10];
	char end[10];
}s[1005];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
	//	memset(s,'\0',sizeof(s));
		scanf("%d",&n);
		int i;
		for(i = 0; i < n; i++)
		{
			scanf("%s",s[i].name);
			scanf("%s",s[i].start);
			scanf("%s",s[i].end);
		}
		int Max = 0;
		int Min = 0;
		for(i = 0; i < n; i++)
		{
			if(strcmp(s[i].start,s[Min].start) < 0)//strcmp(s1,s2) s1 > s2 返回 > 0 s1 < s2 返回 > 0 s1 == s2 返回 0
					Min = i;
			if(strcmp(s[i].end,s[Max].end) > 0)
					Max = i;
		}
		printf("%s %s\n",s[Min].name,s[Max].name);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值