这真的是这一章感觉算是最简单的一道题了,没有输入输出的坑,该怎么读入就怎么读入,该怎么输出就怎么输出。思路正确的话,一遍就可以AC。
我是利用了C++语言的sort函数,对所有正方形的海拔进行排序,从小到大,然后从小的开始加水,加到海拔和倒数第二小的海拔一致即可,到最后水全部加完了或者所有的正方形都被淹没了,便输出结果即可,题真的不难。
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int s[900];
int main()
{
int i,j,m,n,total,cnt = 1,num,flag,diff,water;
double level;
while(scanf("%d%d",&m,&n) && m && n)
{
memset(s,0,sizeof(s));
total = m*n;
for(i = 0;i < total;i++)
{
scanf("%d",&s[i]);
s[i] = s[i]*100;
}
scanf("%d",&water);
sort(s,s+total);
while(water > 0)
{
flag = s[0];
num = 0;
for(i = 0;i < total;i++)
{
if(s[i] == flag)
{
num++;
}
else if(s[i] != flag)
{
diff = s[i] - s[0];
break;
}
}
if(i < total)
{
diff = diff*num;
if(diff >= water)
{
level = flag + double(water)/double(num);
level = level/100.0;
break;
}
else if(water > diff)
{
water = water - diff;
for(j = 0;j < num;j++)
{
s[j] = s[i];
}
}
}
else
{
level = flag + double(water)/double(num);
level = level/100.0;
break;
}
}
printf("Region %d\n",cnt++);
printf("Water level is %.2f meters.\n",level);
printf("%.2lf percent of the region is under water.\n\n",double(num)/double(total)*100.0);
}
}