习题4-10洪水 UVa815
感悟。
1、从网站下载英文原题,重点在看输入输出数据与格式。
2、反复中英文对照,愣是没看懂样例中的Water level is 46.67 meters.
3、题意没理解,编程就没法开始。
4、搜索还是搜索http://blog.youkuaiyun.com/code4101/article/details/38540759,看到这副图,马上明白,本题很快就能弄懂,归根结底,还是英文水平次了点。不过呢,没有下图,反复读英文,还是不能读懂的。
5、开始编码。有个疑问,水平面刚好与该区域齐平,算不算淹没?不算,题中提到under water。
6、多次提交WA,对边界进行多次修改,无水,水将整个网格淹没,但还是WA。
7、从http://blog.youkuaiyun.com/code4101/article/details/38540759拷贝代码,进行对拍,才发现,是输出格式问题,此题与以往不同,以往是例子间有空行,本题是每个例子后有空行,Follow
the output for each region with a blank line.修改,提交AC。
8、本题对水量为0应该没有处理,本人已进行了测试。看看时间2016-11-13 21:50
9、本题容易卡壳有两个地方,一是水是部分淹没还是全部淹没网格,否则WA,二是每个例子后要跟一个空行,否则WA。第二点,不通过对拍,是查不出来的。
10、很高兴,第四章结束,也就是本题为什么本人做得比较急的原因,到第五章真好,等了很久了。
附上AC代码,编译环境Dev-C++4.9.9.2
#include <stdio.h>
const int maxn=40;
int elevation[maxn*maxn];
int cubic[maxn*maxn];
int main(){
int row,col;
int i,j;
int water;
float level;
int count;
int tmp;
int elevationsum;
int kase;
float percent;
kase=0;
while(scanf("%d%d",&row,&col)&&row&&col){
count=0;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
scanf("%d",&elevation[count]);//区域海拔
count++;
}
}
scanf("%d",&water);//水量
for(i=0;i<count;i++){//冒泡排序,区域海拔高度自小到大
for(j=i+1;j<count;j++){
if(elevation[i]>elevation[j]){
tmp=elevation[i];
elevation[i]=elevation[j];
elevation[j]=tmp;
}
}
}
//淹没某个区域的总水量
for(i=0;i<count-1;i++){
cubic[i]=10*10*((elevation[i+1]-elevation[i])*(i+1));
}
cubic[i]=0;
for(i=1;i<count;i++){
cubic[i]+=cubic[i-1];
}
//找出水淹没的地区
for(i=0;i<count;i++){
if(water<=cubic[i]){
break;
}
}
if(i==count){//水将网格淹没
elevationsum=0;
for(j=0;j<count;j++){
elevationsum+=elevation[j];
}
level=(water*1.0/100+elevationsum)/count;
percent=100.00;
}else{//水未将网格淹没
elevationsum=0;
for(j=0;j<=i;j++){
elevationsum+=elevation[j];
}
level=(water*1.0/100+elevationsum)/(i+1);
percent=(i+1)*1.0/count*100;
}
// if(kase>0)//若加上此两行,立马WA 2016-11-13 21:48
// printf("\n");
kase++;
printf("Region %d\n",kase);
printf("Water level is %.2f meters.\n",level);
printf("%.2f percent of the region is under water.\n",percent);
printf("\n");
}
return 0;
}