第一次看这道题的时候是在一个月前,那个时候读题用了好几天(是的,好几天T_T),读完了用自己的理解怎么也没法解释样例数据,就没做了,现在又看一次,还是以前的理解来带数据。。。。竟然对到了(我去!估计以前看了假题目->_->)。。。然后用了大概一小时写代码(好吧,挺慢的。。),第一次交的时候对临界数据处理几乎没有,所以还是没啥信心就想着交交试试,结果竟然一次a,还是蛮激动的,嘿嘿。。,后来看了代码量,还好没上千,就没怎么改。。
题目意思是给你一个地区平面图,这个地区被分为m*n个方格,并告诉你每一个方格海拔高度(有正负),然后告诉你这个地区的总降水量,雨水先从低海拔到高海拔填满,求最后水的高度和水下方格数量所占的百分比。
思路:用一维数组保存所有的高度,然后从小大排序,然后用水把第i(i初始为0)高的方块补为与第(i+1)高的方块的高度相同,水量同时减少,直到水不够。
代码如下
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int main()
{
int squ[1000];
int water;
int m, n, order = 0;
while(scanf("%d%d", &m, &n) != EOF && m && n)
{
order++;
for(int i = 0; i < m*n; i++)
scanf("%d", &squ[i]);
sort(squ, squ + m*n);
scanf("%d", &water);
int i;
for(i = 0; i < m*n - 1; i++)
{
int diff = squ[i+1] - squ[i];
int num = water - diff * 100 * (i+1);
if(num <= 0)break;
else water = num;
}
float high_water, percent;
high_water = squ[i] + (float)water / (100 * (i+1));
percent = (float)(i+1) / (m*n) * 100;
printf("Region %d
", order);
printf("Water level is %.2f meters.
", high_water);
printf("%.2f percent of the region is under water.
", percent);
}
return 0;
}
紫书特意强调这道题的多解性,然而也没想到其他方法,看vj上其他人的也都差不多,也有不同的,大概思路就是把低海拔的方块都换成水,水量也相应增加,如果水量还是小于高海拔,就停止循环,得到了低于水高度的方块的数量,水临界方块的处理也类似,不过觉得还是没什么区别,也就没用这种方法试。。。
做题反思:又是一道看懂了题就没多大问题的题目,(英语硬伤,心累T_T),时间还是用得太久了,就算有思路,不算复杂的题也要用上一小时,嗯~ o(* ̄▽ ̄*)o 还是要多练。