快半个月没刷题了,一直在准备期末考试,终于考完了可以刷题了!思路很清晰的一道题,没有什么特别难的地方,但花的时间长了点。
要点:
先将海拔高度从小到大排列,如果要淹没一个格子,需要比它小的所有格子的雨水的海拔高度都达到这个格子的海拔高度,count=a[i]*(i-1)-sum{a[1],a[2]……a[i-1]}。这道题有很多种方法,我这种还行但我写的代码很难看,懒得简化了
代码如下:
#include<stdio.h>
#include<stdlib.h>
int a[1000];int cmp(const void *a, const void *b)
{return *(int*)a - *(int*)b;
}int main()
{int m, n,i,j;double ans, per;int number = 1;while (scanf("%d%d", &m, &n),m+n){int num;for (i = 1; i <= m; i++)for (j = 1; j <= n; j++)scanf("%d", &a[(i - 1)*n + j]);//为了方便排序将二维数组化为一维的scanf("%d", &num);qsort(a+1, m*n, sizeof(a[0]), cmp);int sum,count;for (i = 2; i <= m*n; i++){sum = 0; //注意sum一开始要赋值为0for (j = 1; j < i; j++)sum += a[j];count = a[i] * (i - 1) - sum;if(count*100>num)break;}i = i - 1;sum = 0;for (j = 1; j < i; j++)sum += a[j];count = a[i] * (i - 1) - sum;ans = (double)(num - count * 100) / (i * 100) + a[i];per = (double)i / (m*n);printf("Region %d\n", number++);printf("Water level is %.2lf meters.\n", ans);printf("%.2lf percent of the region is under water.\n", per*100);printf("\n");}return 0;
}
网上这种方法很不错:
要点:
老规矩先排序,但思路跟我想到的不同,它是先算出这些雨水放进一些格子后算出这些格子的高度,这样直接算高度方便一些,重点设立一个循环记录格子数,雨水总量加上当前格子的高度以及小于当前值的格子的高度再除格子数可以算出这些格子内的雨水高度并和大一些的格子比较,如果小于等于说明成功了。
代码如下(简洁多了):
#include<stdlib.h>
const int inf = 0xffffff;
int a[1000];int cmp(const void *a, const void *b)
{return *(int*)a - *(int*)b;
}int main()
{int m, n,i;double H, num, k;int cas = 1;while(scanf("%d%d",&m,&n),m+n){n = n*m;for (i = 1; i <= n; i++)scanf("%d", &a[i]); //对scanf来说换行符和空格是一样的a[n + 1] = inf;//另设一个最后的值方便后面循环比较脱出scanf("%lf", &num);num /= 100.0;qsort(a + 1, n, sizeof(a[0]), cmp);for (i = 1; i <= n; i++){num += a[i];H = num / i;if (H <= a[i + 1]){k = i;break;}}printf("Region %d\n", cas++);printf("Water level is %.2lf meters.\n", H);printf("%.2lf percent of the region is under water.\n", (double)k*100/n);printf("\n");}return 0;
}