思路:题目中说了不需要考虑几个坑是分开的那种情况,所以可以将所有的方格由低到高排序排序,从最低的方格开始灌水,如果可以淹没它,增加淹没面积、海拔高度和淹没个数,减少体积,再接着看下一个方格,否则计算终高度然后 break 即可。
刚开始 WA 了,我还以为是浮点数精度的问题,尽可能的提高精度之后还是WA,后来发现是输出格式的问题。。。和之前不一样,不是两个 case 之间有空格,是每个 case 之后都有空格。。。
version 1:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 35;
double v;
int m,n,h[maxn*maxn];
int main(){
int kase = 0;
while(scanf("%d%d",&m,&n) == 2 && m){
int t = m*n;
for(int i = 0;i < t;i++) scanf("%d",&h[i]);
scanf("%lf",&v);
sort(h,h + t);
double avere = h[0];
int i,s = 100;
for(i = 1;i < t;i++){
int dv = (h[i] - avere)*s;
if(v > dv){
avere = h[i];
v -= dv;
s += 100;
}
else{
avere += v/s;
break;
}
}
if(i == t) avere += v/s;
printf("Region %d\n",++kase);
printf("Water level is %.2f meters.\n",avere);
printf("%.2f percent of the region is under water.\n\n",i*100.0/t);
}
return 0;
}
version 2(只在最后一步使用了 double,精度更高):
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 35;
int v,m,n,h[maxn*maxn];
int main(){
int kase = 0;
while(scanf("%d%d",&m,&n) == 2 && m){
int t = m*n;
for(int i = 0;i < t;i++) scanf("%d",&h[i]);
scanf("%d",&v);
sort(h,h + t);
double ae2 = 0;
int i,ae1 = h[0],s = 100;
for(i = 1;i < t;i++){
int dv = (h[i] - ae1)*s;
if(v > dv){
ae1 = h[i];
v -= dv;
s += 100;
}else{
ae2 = ae1 + (double)v/s;
break;
}
}
if(i == t) ae2 = ae1 + (double)v/s;
printf("Region %d\n",++kase);
printf("Water level is %.2f meters.\n",ae2);
printf("%.2f percent of the region is under water.\n\n",i*100.0/t);
}
return 0;
}
version 3(更简洁的版本,先把体积除以100):
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 35;
double ae,v;
int m,n,h[maxn*maxn];
int main(){
int kase = 0;
while(scanf("%d%d",&m,&n) == 2 && m){
n *= m;
for(int i = 0;i < n;i++) scanf("%d",&h[i]);
h[n] = 1<<30;
scanf("%lf",&v);
v /= 100.0;
sort(h,h + n);
int i;
for(i = 1;i <= n;i++){
v += h[i-1];
ae = v / i;
if(ae < h[i]) break;
}
printf("Region %d\n",++kase);
printf("Water level is %.2f meters.\n",ae);
printf("%.2f percent of the region is under water.\n\n",i*100.0/n);
}
return 0;
}