UVa 815 Flooded! BY小黑

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);
	}
}

程序运行
在这里插入图片描述在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页