题目:Flooded!
题意:给定一个大小为n*m的地域,每一个方块的边长都为10。已知每一个方块区域的高度和水的总体积,求水平面的高度和被水浸没的面积占种面积的百分之几。
思路:
1、将整个空间想象成被划分为体积为10*10*1的小方块,求出到哪一层小方块就不能被水完全浸没。
2、将不能被水浸没的那层小方块能容纳水的面积求出,再用剩余水的体积除以面积得这一层被水浸没的高度。
3、计算,输出。
注意:
地域的高度可为负,此时,我把所有的高度都加了一个最深的深度(此值为正,也就是最低的高度的相反数),也就是说让所有的地域高度都为非负数。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int h[35][35]= {0};
int Fill;
int k=0,sum=0;
int T=0;
int lowest=0;
void init() {
k=0,sum=0;
lowest=0;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
scanf("%d",&h[i][j]);
if(h[i][j]<lowest) lowest=h[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
h[i][j]-=lowest;
}
}
scanf("%d",&Fill);
}
void Count() {
while(true) {
int s=0;
k++;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(h[i][j]<k) s+=100;
}
}
if(sum+s>=Fill) return;
sum+=s;
}
return;
}
void print(float H,float V){
printf("Region %d\nWater level is %.2f meters.\n%.2f percent of the region is under water.\n\n",++T,H+lowest,V);
}
void Remain(){
int s=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(h[i][j]<k) s+=100;
}
}
float H=((float)Fill-sum)/s+k-1;
float V=(float)s/(n*m*100)*100;
print(H,V);
}
int main() {
while(scanf("%d%d",&n,&m)==2&&n!=0&&m!=0) {
init();
Count();
Remain();
}
return 0;
}