这道题看似简单,但是有两点要注意:
一、取平均数四舍五入取整。
方法是:除出来的小数+0.5,然后强制类型转换成int,这样就行了。这是从图形学里面的DDA算法得来的思想。
二、关于题意的理解
当同一条船有很多‘S’的登记记录,只有一个‘E’的记录时,这时候按理说现在只能算出最后一个‘S’登记和“E”结束时的这个时间段,不能拿最开始的‘S’来计算。。。。。但是参照代码就是这样写的,很是郁闷。。。WA了半个小时。。
AC代码,不是最优的,代码编程上还可以优化很多。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int boat[101][2];
int hour2minute(char time[]){
int minute;
char*q;
char* p=strtok(time,":");
q=p;
p=strtok(NULL,":");
minute=atoi(q)*60+atoi(p);
return minute;
}
int main(){
int i,j,k,count,t;
char ch;
char time[6];
while(scanf("%d",&i)!=EOF){
if(i==-1) break;
getchar();
scanf("%c %s",&ch,time);
for(k=0;k<101;k++)
for(j=0;j<2;j++)
boat[k][j]=0;
count=t=0;
while(i!=0){
if(ch=='S')
{
if(boat[i][1]==0){
boat[i][0]=-hour2minute(time);
boat[i][1]=1;
}
}
else
{
if(boat[i][1]==1)
{
boat[i][0]+=hour2minute(time);
count++;
t+=boat[i][0];
boat[i][0]=0;
boat[i][1]=0;
}
}
scanf("%d %c %s",&i,&ch,time);
}
if(count!=0){
i=t*1.0/count+0.5;
printf("%d %d\n",count,i);
}
else printf("0 0\n");
}
}
同一条船,按照第一个‘S’和第一‘E’还是可以理解的,因为既然有多个‘S’,只有一个‘E’,或者有多个‘E’,只有一个‘S’,都不能判断那唯一一个是与谁对应的。
上面那一句打错特错了。 肯定可以知道是与最近的有关的,因为整体记录是按照时间顺序记录的。如果第一次不还回船的话,就不会有第二次租同一条船。