演算法競賽入門經典(第2版)第4章 函數和遞迴
習題4-10洪水 UVa815
感悟。
1、從網站下載英文原題,重點在看輸入輸出資料與格式。
2、反覆中英文對照,愣是沒看懂範例中的Water level is 46.67 meters.
3、題意沒理解,編程就沒法開始。
4、搜尋還是搜尋http://blog.csdn.net/code4101/article/details/38540759,看到這副圖,馬上明白,本題很快就能弄懂,歸根結底,還是英文水平次了點。不過呢,沒有下圖,反覆讀英文,還是不能讀懂的。
5、開始編碼。有個疑問,水平面剛好與該地區齊平,算不算淹沒。不算,題中提到under water。
6、多次提交WA,對邊界進行多次修改,無水,水將整個網格淹沒,但還是WA。
7、從http://blog.csdn.net/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;
}