uva 815
//注意海拔可为负值。
1 /* 发洪水 h____________________ 2 #include <iostream> 3 #include <cstdio> 4 #include <string> 5 #include <cstring> 6 #include <algorithm> 7 #include <cmath> 8 #include <vector> 9 #include <list> 10 #include <deque> 11 #include <queue> 12 #include <cctype> 13 #include <map> 14 #include <set> 15 #include <bitset> 16 #include <functional> 17 #include <numeric> 18 #include <utility> 19 #include <sstream> 20 #include <iomanip> 21 #include <cstdlib> 22 #include <ctime> 23 #include <cassert> 24 #include <limits> 25 #include <fstream> 26 using namespace std; 27 typedef long long ll; 28 typedef pair<ll,ll> pll; 29 #define pb(x) push_back(x) 30 typedef unsigned long long ull; 31 #define mem(A, X) memset(A, X, sizeof A) 32 #define ford(i,l,u) for(ll (i)=(ll)(l);(i)>=(ll)(u);--(i)) 33 #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e) 34 #define fori(i,l,u) for(ll (i)=(ll)(l);(i)<=(ll)(u);++(i)) 35 typedef pair<int,int> pii; 36 #define sec second 37 #define fir first 38 39 const ll mod=1e9+7; 40 const ll maxn=1e5+10; 41 42 int main() 43 { 44 std::ios::sync_with_stdio(false); 45 freopen("in.txt","r",stdin); 46 int m,n; 47 int kase=0; 48 while(cin>>n>>m&&(m||n)) 49 { 50 int h[920]; 51 fori(i,1,m*n) cin>>h[i]; 52 h[0]=0; 53 int sumwater; 54 cin>>sumwater; 55 56 sort(h+1,h+1+m*n); 57 58 double level=h[1]; 59 double percent=0.000001; 60 if(sumwater) 61 { 62 if(n*m==1) 63 { 64 level=h[1]+sumwater/100.0; 65 percent=100.001; 66 } 67 else 68 { 69 fori(pos,1,n*m) 70 { 71 sumwater+=100*(h[pos]-h[1]); 72 level=(double)sumwater/(pos*100); 73 74 75 if(pos+1<=n*m ) 76 { 77 if(level<=h[pos+1]-h[1]) 78 { 79 percent=(double)pos/(n*m)*100; 80 break; 81 } 82 } 83 else 84 { 85 percent=(double)pos/(n*m)*100; 86 break; 87 } 88 89 } 90 level+=h[1]; 91 } 92 93 94 // fori(pos,1,m*n) 95 // { 96 // sumv+=100*(h[pos]-h[pos-1])*(m*n-pos+1); 97 // cout<<sumv<<endl; 98 // if(sumv>=sumwater) 99 // { 100 // float height=h[pos]; 101 // cout<<h[pos]<<"-------"<<endl; 102 // if(sumv==sumwater) { level=height; } 103 // else 104 // { 105 // int pretemp=0; 106 // while(sumv>sumwater) 107 // { 108 // pretemp=0; 109 // fori(pos,1,n*m) 110 // { 111 // if(h[pos]>=height) { sumv-=1; pretemp++; } 112 // } 113 // height-=0.01; 114 // //cout<<"sumv: "<<sumv<<"height: "<<height<<endl; 115 // } 116 // if(sumv<sumwater) 117 // { 118 // if(sumwater-sumv>sumv+pretemp-sumwater) 119 // { 120 // level=height; 121 // } 122 // else 123 // { 124 // level=height+0.01; 125 // } 126 // } 127 // else level=height; 128 // } 129 130 // break; 131 132 // } 133 // } 134 135 } 136 137 138 cout<<"Region "<<++kase<<endl; 139 cout<<"Water level is "<<setiosflags(ios::fixed)<<setprecision(2)<<level<<" meters."<<endl; 140 cout<<setiosflags(ios::fixed)<<setprecision(2)<<percent<<" percent of the region is under water."<<endl; 141 142 } 143 144 return 0; 145 } 146 147 /*__________ 148 analysis: 149 debug : 海拔有负值,问题是:向n*m的网格,四周为无限长不漏水玻璃构成, 150 其中有一系列高度为h[i][j](可为负值)(由单个实心木块构成,不进水,仅占空间)。现在向其中加v立方米的水, 151 水平面的高度,俯视图中被水完全覆盖(严格小于)的网格面积的百分比。 152 note : 153 */