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; 由大到小排序
}