各位大神帮我看看我到底哪儿错了啊。
大学程序设计题,小明的飞机快要赶不上了!
幸好大厅的路上有一些传送带。每个传送带都有一定的速度,传送带之间没有重叠。
小明自己行走的速度为w,如果传送带的速度为v的话,在传送带上走的速度就是w+v。
但是小明还是很着急,所以他决定跑一段时间t。他跑的速度是r,那么如果传送带的速度为v的话,在传送带上跑的速度就是r+v。
对于时间t,他不一定要连续跑,可以走走再跑。也不一定非要跑够t。
问小明至少需要多少时间才能到达终点。
输入第一行为用例数T,1<=T<=40。
每一组用例的第一行包含五个整数:
X:为大厅的长度,小明起始位于0,终点是X,1<=X<=1000000
W:为走路的速度
R:为跑步的速度,1<=W<R<=100
t:最多能跑t秒,1<=t<=1000000
n:传送带的个数
接下来的n行,表示n个传送带的详细信息。每行包含三个整数:Bi,Ei,Vi,分别表示传送带的起始位置、终止位置和速度,0<=Bi<Ei<=X,1<=vi<=100
输出包含一个数字,表示至少需要多少时间。输出四舍五入到6位小数。
我的代码是:
#define _CRT_SECURE_NO_DEPRECATE
# include <stdio.h>
# include <stdlib.h>
int cmp(const void *a, const void *b);
struct Belt
{
double lengthOfBelt;
double speed;
}Data[1000000];
void calculate(double x, double w, double r, double t, int n);
int main(void)
{
int NumOfData;
int i, n;
double x, w, r, t;//x代表大厅长度,w为行走速度,r为跑步速度,t代表小明最多能跑t秒
scanf("%d", &NumOfData);
for (i = 0; i < NumOfData; i++)
{
scanf("%lf %lf %lf %lf %d", &x, &w, &r, &t, &n);
calculate(x, w, r, t, n);
}
return 0;
}
void calculate(double x, double w, double r, double t, int n)
{
int i, j;//n代表传送带的数量
double lengthOfLand, TimeSum = 0.0;
double TimeOfRuningOnBelt;
lengthOfLand = x;
double a, b;
for (i = 0; i < n; i++)
{
scanf("%lf %lf %lf", &a, &b, &Data[i].speed);
Data[i].lengthOfBelt = b - a;
}
for (i = 0; i < n; i++)
lengthOfLand -= Data[i].lengthOfBelt;
//当能够跑完全程的时候
if (r*t >= x)
{
for (i = 0; i < n; i++)
{
TimeSum += Data[i].lengthOfBelt / (r + Data[i].speed);
}
TimeSum += lengthOfLand / r;
}
//不能跑完全程的时候
else
{
//当连无传送带的陆地上都无法跑完的时候
if (r*t <= lengthOfLand)
{
for (i = 0; i < n; i++)
{
TimeSum += Data[i].lengthOfBelt / (w + Data[i].speed);
}
TimeSum += t + (lengthOfLand - r*t) / w;
}
//当陆地可以跑完,并且可以跑部分传送带的时候
else
{
qsort(Data, n, sizeof(Data[0]), cmp);
//排序过了
TimeSum += lengthOfLand / r;
TimeOfRuningOnBelt = t - (lengthOfLand / r);
for (i = 0; i < n; i++)
{
if (Data[i].lengthOfBelt / (r + Data[i].speed) <= TimeOfRuningOnBelt)
{
TimeSum += Data[i].lengthOfBelt / (r + Data[i].speed);
TimeOfRuningOnBelt -= Data[i].lengthOfBelt / (r + Data[i].speed);
}
else
{
TimeSum += TimeOfRuningOnBelt;
TimeSum += (Data[i].lengthOfBelt - TimeOfRuningOnBelt*(r + Data[i].speed)) / (w + Data[i].speed);
for (j = i +1; j < n; j++)
{
TimeSum += Data[i].lengthOfBelt / (w + Data[i].speed);
}
break;
}
}
}
}
printf("%.6lf\n", TimeSum);
return;
}
int cmp(const void *a, const void *b)
{
return (*(struct Belt *) a).speed > (*(struct Belt *) b).speed ? 1 : -1;
}
结果我用了很多测试用例,包括好些大数据用例都过了,但是有几个只有几十组的用例过不了,实在找不到错在哪里。。
[解决办法]
Data[1000000]你确定你能用这么多的内存吗?
都快16M了,运行起来不见得能够顺畅。