题意:
一个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;
}