POJ 1877 Flooded!
2012-04-24 18:37
239 查看
迷惑:为啥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)
题目:
将一个区域分成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; }
相关文章推荐
- POJ1877 - Flooded! - 模拟
- poj1877 Flooded!(模拟)
- POJ-1877 Flooded! 赛前水一题
- POJ 1877 Flooded!(二分)
- poj 1877 Flooded!
- POJ 1877 Flooded!
- POJ-1877 Flooded!(贪心模拟)
- 【贪心】【模拟】[POJ1877]Flooded!
- poj 1877 Flooded!
- 【原创】【贪心优化暴力模拟】Flooded! POJ 1877
- (使用STL自带的排序功能进行排序)POJ 1877 Flooded!()
- poj1877模拟题
- POJ 1877
- POJ-1877,3903 LIS
- poj_1877
- poj 1192 最优连通子集
- ZOJ 1133 & POJ 1142 Smith Numbers
- POJ 2185 Milking Grid
- POJ 3687 Labeling Balls【拓扑排序】
- POJ 1816