输入每个格子的海拔高度,以及网格内雨水的总体积,输出水位的海拔高度以及有多少百分比的区域有水(即高度严格小于水平面)
方法比较多,我的思路是:先把每个格子的高度存放在一维数组里,然后按从小到大排列,用water表示水的数量和剩余的数量,每上升到一个格子的高度就减water,直到water不够上升到另一个高度;然后进行计算输出。
#include <stdio.h>
int n, m, net[900], water, number = 0;
double hight;
void minmax(int num) //改变数组为从小到大排列
{
int i, j, t, team;
for(i = 1; i < num; i++)
{
t = i;
for(j = i+1; j <= num; j++)
{
if(net[t] > net[j])
t = j;
}
if(t != i)
{
team = net[t];
net[t] = net[i];
net[i] = team;
}
}
}
int main()
{
while(scanf("%d%d", &n, &m) && n && m)
{
int i;
number++;
for(i = 1; i <= n*m; i++)
{
scanf("%d", &net[i]);
}
scanf("%d", &water);
minmax(n*m);
hight = 0;
for(i = 1; i < n*m; i++)
{
int t;
if(water > 0)
{
t = (net[i+1] - net[i]) * i * 100.0;
if(water > t)
water = water - t;
else if(water == t)
{
hight = net[i+1];
water = 0;
break;
}
else
{
hight = net[i] + water/(i * 100.0);
water = 0;
break;
}
}
}
if(i == n*m && water)
{
hight = net[i] + water/(i * 100.0);
}
printf("Region %d\n", number);
printf("Water level is %.2f meters.\n", hight);
printf("%.2f percent of the region is under water.\n", i*100.0/(n*m));
}
return 0;
}