这道题的大意是让你来计算各个接力队的平均速度。输入的第一个数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;
}