UVa 815 Flooded!
赛题说明:
英文题目的大致意思为,已知这个地区每个区域的海拔值,每个区域为10*10的正方形,又已知雨水的总量,题目需要我们计算出这个地方有多少区域被淹没以及水面的高度。
输入:
1.该地区的区域大小(该区域的长和宽,以10m为一个单位长度)
2.依次输入每个区域的海拔
3.雨水总量
输出:
1.雨水的海拔
2.被水淹的格子的比例
小黑题解:
程序模拟整个过程:
1.使用排序算法将格子的海拔从低至高排序
2.使用程序模拟雨水的淹没过程
3.每淹一个格子计算剩余的雨水量,如果总量为正则继续淹下一个格子,如果为负则到此为止,然后计算出海拔的大小。
注意:
1.如果排序后,相邻的格子海拔相等,则它们要同时被淹。
2.计算海拔时,先假设这个格子被淹没,然后用计算雨水量的差值进行计算。
3.如果所有格子被淹没,计算海拔时要单独讨论
小黑图解:
程序实现:
package 习题4_10洪水;
import java.util.Scanner;
public class test {public static void main(String[] args) {System.out.println("请输入房屋大小和每一块儿海拔:");Scanner sc = new Scanner(System.in);int m = sc.nextInt(); //行数int n = sc.nextInt(); //初始化列数int p = m * n; //初始化被淹没格子的数量double h = -1; //初始化海拔高度int[] arr = new int[m*n];for (int i = 0; i < m*n; i++) {arr[i] = sc.nextInt();}int sum = sc.nextInt(); //总水量for (int i = 0; i < arr.length; i++) { //冒泡排序算法,将海拔从高到低排序for (int j = 0; j < arr.length - i - 1; j++) {if(arr[j+1]<arr[j]){int temp = arr[j+1];arr[j+1] = arr[j];arr[j] = temp;}}}int i;for (i = 0; i < arr.length - 1; i++) { //依次模拟从低海拔至高海拔淹格子if(arr[i] == arr[i+1]){ //如果有相邻格子海拔相等,则同时淹。continue;}sum = sum - (arr[i+1]-arr[i])*100 * (i+1); //假设这个格子已被水淹没,求剩余水量(可正可负)if(sum <= 0){ //水恰好淹到这个格子,不会淹到下一个格子,直接跳出循环h = arr[i+1] + sum / (100.0 * (i+1)); //计算海拔高度(海拔高度=海拔变化量+下一个领地的海拔高度)p = i + 1;break;}}if(i == arr.length - 1 ){ //最后一个格子也进水了的情况需要单独进行讨论h = sum*1.0 / ((m*n)*100) ;}System.out.println("已经被水淹的格子数量为"+p+"个,占总体格子的%"+(p+0.0)/(m*n)*100);System.out.println("此时海拔高度为:"+h);}
}
程序运行: