uva 815之理解诡异的海平线题目之不容易

首先题意:(这个真的令人无奈,题目都看不太明白)

网上百度了一下,就是以下意思:

给你n*m个格子,每个格子的面积是10*10米,整个区域外看作无限高的墙壁。输入每个格子的海拔高度(可能为负数),以及区域内的雨水总体积,输出区域水位的海拔高度以及淹没方格的占比。

注明一下:星星假装为水,题目给出了每个格子的海平面的高度。

最最最需要知道的是,装水是两个海平面之间的那个区域可以放水,而不是我画的那个方格,存水的是方格外面的区域。

海平线高度是什么意思——每个方格的海拔相当于这个方格的固体体积,可以把它们都看作木块,雨水只存在两个木块间高度差的空间内。

用两个栗子来解释一下!!!

1 case 1:
2 3 1
3 10 20 30
4 3000
5 解答:
6 首先我们看一下3000是否会将所有格子的空间都填埋了?   填埋最少所需的水量:((30-10)+(30-20))*10*10=3000
7 我们可以看到完全可以
8 所有答案是   h=30    百分比是1
图示:
30
20 20
10 10 10
0 0 0
case 2:
3 1
-10 -20 -30
3000
解答:
首先我们看一下3000是否会将所有格子的空间都填埋了?   填埋最少所需的水量:((30-10)+(30-20))*10*10=3000
我们可以看到完全可以
所有答案是   h=-10    百分比是1
图示:
0
-10
-20 -20
-30 -30 -30
1 3 1
2 10 20 30
3 2000
4 Region 1
5 Water level is 25.00 meters.
6 66.67 percent of the region is under water.
1 3 1
2 -10 -20 -30
3 2000
4 Region 6
5 Water level is -15.00 meters.
6 66.67 percent of the region is under water.

通过上面的这些栗子,大概能明白本题的题意了吧!!!

 现在就是解决问题的代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,m;
    double count;
    int t=0;
    while(cin>>n>>m)
    {
        if(t!=0)
        cout<<endl;
        if(n==0&&m==0)
        break;
        t++;
        double a[1000];
        double sum=0;
        double lever=0;
        double len=0;
//        double sum1=0;
        for(int i=0;i<n*m;i++)
        {
        cin>>a[i];
        }
        
        sort(a,a+n*m);
        
        for(int i=0;i<n*m-1;i++)
        sum+=(a[i+1]-a[i])*(i+1);
//        cout<<"sum: "<<sum<<endl;
        
        cin>>count;
        count/=100;
        
        if(sum<=count)
        {
        lever=100;
        len=a[n*m-1]-a[0];    
        count=count-sum;
        len+=count/(n*m);
        }
        else
        {
//        lever=count*100/(sum*1.00);
        for(int i=0;i<n*m-1;i++)
        {
            if((a[i+1]-a[i])*(i+1)>=count)
            {
                len+=count/(i+1);
                lever++;
                break;
            }
            else
            {
                len+=(a[i+1]-a[i]);
                count-=(a[i+1]-a[i])*(i+1);
                lever++;
            }
        }
        lever=lever/(n*m)*100;
        }
        len=len+a[0];
        cout<<"Region "<<t<<endl;
        cout<<"Water level is ";
        printf("%.2lf",len);
        cout<<" meters."<<endl;
        printf("%.2lf",lever);
        cout<<" percent of the region is under water."<<endl;
        
    }
}
View Code

 

posted @ 2019-03-24 13:31  saaas  阅读(227)  评论(0编辑  收藏  举报