815:Flooded!

Flooded!


思路:题目中说了不需要考虑几个坑是分开的那种情况,所以可以将所有的方格由低到高排序排序,从最低的方格开始灌水,如果可以淹没它,增加淹没面积、海拔高度和淹没个数,减少体积,再接着看下一个方格,否则计算终高度然后 break 即可。

刚开始 WA 了,我还以为是浮点数精度的问题,尽可能的提高精度之后还是WA,后来发现是输出格式的问题。。。和之前不一样,不是两个 case 之间有空格,是每个 case 之后都有空格。。。

version 1:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 35;
double v;
int m,n,h[maxn*maxn];
int main(){
    int kase = 0;
    while(scanf("%d%d",&m,&n) == 2 && m){
        int t = m*n;
        for(int i = 0;i < t;i++) scanf("%d",&h[i]);
        scanf("%lf",&v);
        sort(h,h + t);
        double avere = h[0];
        int i,s = 100;
        for(i = 1;i < t;i++){
            int dv = (h[i] - avere)*s;
            if(v > dv){
                avere = h[i];
                v -= dv;
                s += 100;
            }
            else{
                avere += v/s;
                break;
            }
        }
        if(i == t) avere += v/s;
        printf("Region %d\n",++kase);
        printf("Water level is %.2f meters.\n",avere);
        printf("%.2f percent of the region is under water.\n\n",i*100.0/t);
    }
    return 0;
}

version 2(只在最后一步使用了 double,精度更高):

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 35;
int v,m,n,h[maxn*maxn];
int main(){
    int kase = 0;
    while(scanf("%d%d",&m,&n) == 2 && m){
        int t = m*n;
        for(int i = 0;i < t;i++) scanf("%d",&h[i]);
        scanf("%d",&v);
        sort(h,h + t);
        double ae2 = 0;
        int i,ae1 = h[0],s = 100;
        for(i = 1;i < t;i++){
            int dv = (h[i] - ae1)*s;
            if(v > dv){
                ae1 = h[i];
                v -= dv;
                s += 100;
            }else{
                ae2 = ae1 + (double)v/s;
                break;
            }
        }
        if(i == t) ae2 = ae1 + (double)v/s;
        printf("Region %d\n",++kase);
        printf("Water level is %.2f meters.\n",ae2);
        printf("%.2f percent of the region is under water.\n\n",i*100.0/t);
    }
    return 0;
}

version 3(更简洁的版本,先把体积除以100):

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 35;
double ae,v;
int m,n,h[maxn*maxn];
int main(){
    int kase = 0;
    while(scanf("%d%d",&m,&n) == 2 && m){
        n *= m;
        for(int i = 0;i < n;i++) scanf("%d",&h[i]);
        h[n] = 1<<30;
        scanf("%lf",&v);
        v /= 100.0;
        sort(h,h + n);
        int i;
        for(i = 1;i <= n;i++){
            v += h[i-1];
            ae = v / i;
            if(ae < h[i]) break;
        }
        printf("Region %d\n",++kase);
        printf("Water level is %.2f meters.\n",ae);
        printf("%.2f percent of the region is under water.\n\n",i*100.0/n);
    }
    return 0;
}

posted @ 2018-04-14 22:10  ACLJW  阅读(143)  评论(0编辑  收藏  举报