题目:有一个n*m(1≤m,n≤30)的网格,每个格子都是10米的正方形,网格的四周是无限高的墙壁,输入每个格子的海拔高度(每个格子都为实心),以及网格内雨水总体积,输出水位的海拔高度以及有多少百分比的区域有水(==水平面高度视作无水)
心得:
1、理解题目用了不少时间,原因在于没有考虑最外层的高墙
2、坑爹的输出,WA了5次,最后看了别人的博客才知道每组输出之间要有一个空行!!
3、这题还有很多种方法。比如:从低到高遍历,用(水体积+目前为止格子体积)/目前为止的格子数 算出平均海拔,和下一块的高度作比较,如果小于下一块高度,则break;否则继续遍历
代码:
#include"stdio.h"
#include"stdlib.h"
int cmp(const void *a,const void *b){
return *(int *)a - *(int *)b;
}
int main()
{
int a[905],n,m,i,set=1,f;
float water,high;
while(scanf("%d%d",&n,&m)==2&&n!=0)
{
n=n*m;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
a[n] = 1000000;
scanf("%f",&water);
water /= 100;
qsort(a,n+1,sizeof(int),cmp);
printf("Region %d\n",set++);
if(n==1)
{
printf("Water level is %.2f meters.\n%.2f percent of the region is under water.\n\n",water+a[0],1.0*100);
continue;
}
for(i=0,high=0,f=0;water > a[i+1] - a[i];i++)
{
if(i == n-1);
else if(a[i] == a[i+1])
{continue;}
if(water <= (i+1) * (a[i+1] -a[i]))
{
high += water / (i+1);
i++;f=1;
break;
}
water -= (i+1) * (a[i+1] -a[i]);
high += (a[i+1] -a[i]);
}
high += a[0];
if(water <= (i+1) * (a[i+1] -a[i])&& f == 0)
{high += water / (i+1);i++;}
printf("Water level is %.2f meters.\n%.2f percent of the region is under water.\n\n",high,(float)i/n*100);
}
}