【ACM】杭电1036:Average is not Fast Enough!


这道题的大意是让你来计算各个接力队的平均速度。输入的第一个数N意思是比赛的节数,第二个数D 为赛道的距离,单位是千米。第二行第一个数是队伍编号,这个没有什么意义,照着输出就行了,后面是一个以h:mm:ss格式表示的时间,以空格分隔,意为这个队伍完成这一小节比赛所消耗的时间,把所有的时间加起来就是这个队跑完全程(也就是上面输入的D)所用的总时间。我们的任务是,对于每一组输入数据,输出这个队伍的平均速度,单位是min/km

分析:

这道题没有难度,但有几点需要注意的地方:

1、输入队伍编号的时候要用%3d格式,否则前面的空格就会把输入搞乱了

2、可以把h:mm:ss格式的时间当做字符串输入,存放在一个char数组中,然后用 strtok函数一步一步地把里面的数字分离出来。

3、要把单位换算成 m:ss,min/km,即跑一千米用多少时间。

4、计算结果的过程中注意要四舍五入,不能全部用整形变量,否则会因为误差而Wrong Answer。

5、输出结果时,注意当秒数只有1位数的时候要在前面补0(不能出现4:8这种格式),否则依然Wrong Answer.


代码和注释:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
	int hh,mm,ss;
}TIME;
typedef struct
{
	char ch[20];
}STRING;
int is_qualified(char *s,int len)
{
	int i;
	for(i = 0 ; i < len ; ++i)
	{
		if('-' == s[i])
			return 0;
	}
	return 1;
}
int get_time(TIME *pTime,char *s,int len,STRING *str) /* ·µ»Ø×ܵÄÃëÊý */
{
	int t = 1,i,res = 0;
	char *pT = strtok(s," ");
	while(pT) /* °´¿Õ¸ñ·Ö¸î£¬°Ñÿ×éʱ¼ä·ÖÀë³öÀ´ */
	{
		if(0 == is_qualified(pT,strlen(pT))) /* ±»ÌÔÌ­µÄʱ¼ä */
		{
			return -1;
		}
		strcpy(str[t].ch,pT); /* °ÑµÚÒ»×éʱ¼äCOPYµ½STRING½á¹¹ÌåÖÐ */
		++t;
		pT = strtok(NULL," ");
	}
	/* Ñ­»·½áÊøºó£¬t×ÜÊDZÈʵ¼Ê³¤¶È´ó1 */
	for(i = 1 ; i <= t - 1 ; ++i)
	{
		char ch[20];
		int ix = 1;
		strcpy(ch,str[i].ch);
		pT = strtok(ch,":");
		while(pT)
		{
			if(1 == ix)
				sscanf(pT,"%d",&pTime->hh);
			else if(2 == ix)
				sscanf(pT,"%d",&pTime->mm);
			else
				sscanf(pT,"%d",&pTime->ss);
				
			pT = strtok(NULL,":");
			++ix;
		}
		res += pTime->hh * 60 * 60 + pTime->mm * 60 + pTime->ss; /* ¼ÆËã³öÕâÒ»×éʱ¼äµÄÃëÊý */
	}
	return res;
}
int main(int argc, char *argv[])
{
	int section;
	double dis;
	while(scanf("%d%lf",§ion,&dis) != EOF)
	{
		int team;
		while(scanf("%3d ",&team) != EOF)
		{
			TIME time;
			STRING str[21];
			int ss,ss_ave;
			memset(&time,0,sizeof(TIME));
			memset(str,0,sizeof(STRING) * 21);
			
			char ch[500]; /* ʱ¼ä´® */
			gets(ch);
			ss = get_time(&time,ch,strlen(ch),str);
			if(ss != -1) /* ʱ¼äºÏ·¨ */
			{
				ss_ave = ((ss / dis) * 10 + 5) / 10; /* ¼ÆËã second/KM £¬ËÄÉáÎåÈë */
				
				
				if(ss_ave % 60 > 9)
					printf("%3d: %d:%d min/km\n",team,ss_ave / 60,ss_ave % 60);
				else
					printf("%3d: %d:0%d min/km\n",team,ss_ave / 60,ss_ave % 60);
			}
			else /* ±»ÌÔÌ­ */
				printf("%3d: -\n",team);
		}
	}
	return 0;
}


转载于:https://www.cnblogs.com/whongfei/archive/2012/10/28/5247027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值