POJ 1877 Flooded!

迷惑:为啥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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值