题意:
一个n*m的方格区域,共有n*m个方格,每个方格是边长为10米的正方形,整个区域的外围是无限高的高墙,给出这n*m个方格的初始高度,和洪水的总体积,计算灌入洪水后这个方格区域的水面高度,以及洪水淹没比例。
分析:
淹没肯定是从高度最低的方格就开始的,所以先将n*m个方格从小到大排序。如果洪水要想淹没下一个方格,那么剩余洪水的体积必须>=已经淹没方格的面积*已经淹没方格的数量,这样水面才能整体拔高。如果满足不了这个条件,只能在原来的高度上均匀拔高了。
需要注意的是:
①由于每个方格都是10*10的正方形面积,可以先将洪水体积/100,这样只需考虑高度。
②洪水有可能淹没整个地区
#include <stdio.h>
#include <string.h>
#define maxn 900
int i,j,cases=0,n,m,tot,t;
int a[maxn];
double sum,high,per;
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(~scanf("%d%d",&n,&m)&&n)
{
for(i=1;i<=n*m;i++)
scanf("%d",&a[i]);
scanf("%lf",&sum);
sum/=100;
for(i=1;i<n*m;i++)//选择排序
{
t=i;
for(j=i+1;j<=n*m;j++)
if(a[j]<a[t]) t=j;
if(t!=i)
{
int tmp=a[i];
a[i]=a[t];
a[t]=tmp;
}
}
for(i=2;i<=n*m;i++)
{
tot=(a[i]-a[i-1])*(i-1);
if(sum>=tot)
{
sum-=tot;
}
else
{
high=a[i-1]+sum/(i-1);
sum=0;
per=(i-1)*1.0/n/m;
break;
}
}
if(sum)//淹没整个地区仍有剩余
{
high=a[n*m]+sum/n/m;
per=1;
}
printf("Region %d\n",++cases);
printf("Water level is %.2lf meters.\n",high);
printf("%.2lf percent of the region is under water.\n\n",per*100);
}
return 0;
}