题意挺长的,而且是英文的,我这里就简述一下吧,就是有m*n个格子,每个格子都是10*10的规格(高度是无限的),给出每个格子的海拔,然后给出一个洪水的量,输出最后水深度和完全被水覆盖的面积百分比。这个主要理解问题在于,不存在什么盆地之类的问题,这些格子就像连通器一样,涨水都是一块涨的,嗯,大概就是这个意思了。
至于思路嘛,我的思路就是一维数组排序之后,从最低的开始挨个判断覆盖这个格子之后是否还有洪水剩余,如果有就进行下一个,如果没有就算出实际高度。
这题有俩坑点,第一个是必须要把格子处理成1*1的,然后把洪水也缩小100倍,否则会WA,还有就是,每个样例要多输出一个空行。
另外有好的思路还希望大家交流~
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main() {
//freopen("input.txt","r",stdin);
int n,m;
int region=1;
while(cin>>n>>m) {
double squ[1000];
if(n==0 && m==0)
break;
//储存到一维数组中
for(int i=0;i<n*m;i++)
cin>>squ[i];
double flood;
cin>>flood;
//这里要处理一下,否则会超限(反正因为这个WA了无数次)
flood/=100;
//从小到大
sort(squ,squ+n*m);
double high,per;
for(int i=0;i<n*m;i++){
if(i!=n*m-1){
//如果填满后洪水还剩余
if( (squ[i+1]-squ[i])*(i+1) < flood)
flood-=(squ[i+1]-squ[i])*(i+1);
else{
//如果没有剩余
high=flood/(i+1);
high+=squ[i];
per=(double)(i+1)/(m*n);
per*=100;
break;
}
}else{
//如果填满了所有的格子还是有剩余
high=flood/(i+1);
high+=squ[i];
per=(double)(i+1)/(m*n);
per*=100;
}
}
//还有OJ的变态毛病,就是必须要多输出一个回车符下行
printf("Region %d\nWater level is %.2lf meters.\n%.2lf percent of the region is under water.\n",region++,high,per);
}
return 0;
}