UVA-4.10(ti)-Flooded-815

UVA-4.10(ti)-Flooded-815
题目描述:
链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=833&page=show_problem&problem=756
有一个M*N的网格,每个格子是边长10米的正方形,网格四周是无限大的墙壁。输入每个格子的海拔高度,以及网格内雨水的总体积,输出水位的海拔高度以及有多少百分比的区域有水(即高度严格小于水平面)
题目分析:
这个题虽说是网格,但是可以把它想象成高度 不同的一趟柱子,每个柱子直接的高度差可以放水,然后最后一个柱子可以再在后面加一个无限高的柱子方便想象边界情况。然后排个序,拿循环算就可以了。
不过这里复习一下快排函数的用法:
函数头:

qsort(&num[1], n*m, sizeof(double), cmp);

分别是要排序的数组或者其他东西的首地址,排序的个数,单个的大小(所占内存),以及一个指针函数判断排序规则

int cmp(const void *a, const void *b)
{
    return *(double*)a - *(double*)b; //由小到大排序
    //return *(int *)b - *(int *)a; 由大到小排序
}

大体就是这样,熬夜写题,懒得后果,快要累死了=。=

给出代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b);
int main()
{
    //freopen("D:\\output.txt", "w", stdout);
    double num[920];
    memset(num,0,sizeof(num));
    int m,n;
    int mark=0;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        mark++;
        if(mark!=1)
            printf("\n");
        if(m==0&&n==0)
            break;
        int i,j;
        for(i=1; i<=m*n; i++)
            scanf("%lf",&num[i]);
        qsort(&num[1], n*m, sizeof(double), cmp);
        double water;
        scanf("%lf",&water);
        water=water/100;
        int count=0;
        double x=0;
        double high=0;
        for(i=1; i<=n*m; i++)
        {
            count++;
            if(i!=m*n)
            {
                x=(num[i+1]-num[i])*count*1.0;
                if(water>=x)
                {
                    water-=x;
                    high=num[i];
                }
                else
                {
                   high=num[i];
                   high=high+(water/count);
                   break;
                }
            }
            else
            {
                 high=num[i];
                 high+=(water/count);
            }

        }
        /*for(i=1;i<=n*m;i++)
            printf("%.1f ",num[i]);
        printf("\ncount=%d\n",count);*/
        double a=count/(m*n*1.0)*100;
        printf("Region %d\n",mark);
        printf("Water level is %.2f meters.\n",high);
        printf("%.2f percent of the region is under water.\n",a);
        memset(num,0,sizeof(num));
    }
}
int cmp(const void *a, const void *b)
{
    return *(double*)a - *(double*)b; //由小到大排序
    //return *(int *)b - *(int *)a; 由大到小排序
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值