迷惑:为啥C能过,GCC就是Output Limit Exceeded
题目:
将一个区域分成m*n个方块,每个方块有有一个海拔(可正可负)。求当给区域注入指定容量的水时,水面的海拔是多少,以及被水淹没的方块占总方块数的百分比。每个方块的面积为100m^2,水的容量单位为立方米。
解题思路:
1 由于注水时,水会先填满海拔低的方块,所以将方块按海拔从低到高排序。
2 将水的高度设置为第一个方块的海拔,从第2个方块开始遍历。用sum_water表示已经注入的水量,初始为0.
3 遍历方块i时,计算temp_water=100*i*(elevation[i]-elevation[i-1]);elevation保存方块的海拔。如果sum_water+temp_water小于给定的水容量,则需要继续遍历,将水的高度设置i方块的海拔;如果大于等于给定的水体积,则填充完毕,将水的高度加上(water-sum_water)/(100*i);
4 如果遍历完所有方块还没达到给定的水容量,将水的高度加上(water-sum_water)/(100*方块数);方块覆盖率为100%。
5 输出结果
注意的地方;
1 计算精度,最好用double
2 水容量为0时,覆盖率为0%
代码:(C能过,GCC就是Output Limit Exceeded)
#include<stdio.h>
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int elevation[900];
void print(int regionNum, double water_l, double percent)
{
printf("Region %d\nWater level is %.2lf meters.\n%.2lf percent of the region is under water.\n\n", regionNum, water_l, percent);
}
int main()
{
int m,n,i;
int region_num; //区域的个数
int sq_num; //方块的个数
double water; //水的体积
double temp_water; //实时计算出的水体积
double sum_water; //已经计算出来的水体积
double water_height; //水面相对最低方块海拔的高度
region_num=0;
scanf("%d %d", &m, &n);
while(m!=0 && n!=0)
{
region_num++; //区域个数加1
sq_num = m*n; //计算方块的个数
//输入方块的海拔数据
for(i=0; i<sq_num; i++) scanf("%d", &elevation[i]);
//输入水的体积
scanf("%lf", &water);
//对方块的海拔数据排序
qsort(elevation, sq_num, sizeof(int), cmp);
if(water > 0)
{
//计算水面的海拔
sum_water=0;
water_height=elevation[0];
for(i=1; i<sq_num; i++)
{
temp_water = 100*i*(elevation[i]-elevation[i-1]);
if(temp_water==0) continue;
if(sum_water + temp_water < water) //还没有达到水的总体积
{
sum_water += temp_water;
water_height = elevation[i];
}
else //达到或超过了水的总体积
{
water_height += (water-sum_water)/(100*i);
sum_water = water;
//输出结果
print(region_num, water_height, (double)(i*100)/(double)sq_num);
break;
}
}
if(i==sq_num && sum_water<water)
{
water_height += (water-sum_water)/(100*sq_num);
print(region_num, water_height, 100);
}
}
else //water为0
{
print(region_num, elevation[0], 0);
}
scanf("%d %d", &m, &n);
}
return 0;
}