神坑之题啊啊啊啊啊啊啊啊啊啊啊!!!!!错4发!~!~!~
经验之谈:数据一定找各种测试,多测试几组防止WA,第一次输入0时要测试;可用输出法看是否进入循环、循环几次等。
此题没什么技巧,把数据输入存进结构体num[i]数组,求当天时间(小时*60+分钟)。用嵌套循环,一个for (i)循环外记录判断S,一个for (j) 循环判断基础E,如果 [i] [j] 船号相等而且一个E一个S,用时间相减并且标记
num[i].ch为1,如果ch正确,就代表该i的船号借出归还正确,就可以加上这段时间,并且总借船量+1,求总时间除以总借船量。
首先要注意平均值结果四舍五入 : y=(int)(x+0.5)>(int)x?(int)x+1:(int)x
其次注意分母为零时!应另外分开输出;
给出一组测试数据:
1 S 08:00
1 E 09:00
1 S 10:00
1 E 11:00
1 S 11:00
1 E 12:00
0 E 17:00
#include<stdio.h>
struct node
{
int count;
int n;
int t1;
int t2;
int t;
char k;
int ch;
}num[10005]={0,0,0,0,0,0,};
int main()
{
while(~scanf("%d",&num[0].n)&&num[0].n!=-1)
{
scanf(" %c %d:%d",&num[0].k,&num[0].t1,&num[0].t2);
num[0].count=0;
int mark=0;
int sum_1=0;
double sum_2=0.0;
num[0].t=num[0].t1*60+num[0].t2;
if(num[0].n==0)
{
printf("0 0\n");
continue;
}
for(int i=1; ; i++ )
{
scanf("%d %c %d:%d",&num[i].n,&num[i].k,&num[i].t1,&num[i].t2);
num[i].t=num[i].t1*60+num[i].t2;
num[i].count=0;
num[i].ch=0;
if(num[i].n==0)
{
mark=i;
break;
}
}
for(int i=0;i<mark;i++ )
{
for(int j=i+1; j<mark;j++)
{
if(num[i].n==num[j].n&&num[i].k=='S'&&num[j].k=='E')
{
num[i].count=num[j].t-num[i].t;
j=mark;
num[i].ch=1;
}
}
if(num[i].ch&&num[i].k=='S'&&num[i].n!=0)
{
sum_2=num[i].count*1.0+sum_2;
++sum_1;
}
}
if(sum_1==0)
{
printf("0 0\n");
continue;
}
sum_2=sum_2/sum_1;
sum_2=(int)(sum_2+0.5)>(int)sum_2?(int)sum_2+1:(int)sum_2;
printf("%d %d\n",sum_1,(int)sum_2);
}
}