Java实现——洛谷 P1317 低洼地

        今天又是遇到一道很有趣的题目,题目并不难,主要考虑的比较多,闲话少叙,进入正题。


低洼地 —— 题目描述

        一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?

如图:地高变化为

输入格式

两行,第一行 n ,表示有 n 个数。第二行连续 n 个数表示地平线高度变化的数据,保证首尾为0

\left ( 3\leq n\leq10000,0\leq height\leq 1000\right )

输出格式

一个数,可能积水低洼地的数目。

样例 

样例输入
        10
         0 1 0 2 1 2 0 0 2 0

样例输出
        3


        题目总的来说浅显易懂,就是要计算这些山峰之间有多少个洼地

        洼地的特征就是中间低,两边高,对应到题目中就是:两个较大的数之间夹着一个较小的数。这个就是解决本题的基本点。

        在思考的过程中发现这个点可以更加简化,只要是有存在上下坡的变化时就可能存在洼地。上坡:数值变大,下坡:数值变小。在下坡变化到上坡时必定会存在洼地。所以要设置一个上下坡的状态(代码中用 status 表示),以及两个高度(一个保存上一次的高度——last ,另一个保存当前输入的高度——height)来辅助判断。

        在第一次提交测试的时候忽视了—— 平地(高度不变),于是我开始思考,高度不变的情况又可以延伸为四种:

  • 上 ——>平 ——>上

        

  • 下 ——>平 ——>下

        

  • 上 ——>平 ——>下

        

  • 下 ——>平 ——>上

        

        很明显的看到只有 : 下 ——>平 ——>上 这一种可能性才会形成洼地。并且,对于前三种情况来说,中间的平地并不影响上升或者下降的趋势所以将 平地 —— 归于前一种上下坡的状态。

运行代码

import java.util.*;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(), height, last = 0, count = 0, status = 0;
        // 初始状态为平地。 
        // status——状态: -1 —— 下坡,0 —— 平地, 1 —— 上坡
        // last——上一次的高度,height——当前高度
		for (int i = 0; i < n; i++) {
            //输入高度
			height = sc.nextInt();
            // 洼地判断:
            // 如果当前状态(上一次状态)为下坡,且当前的高度 > 上一次的高度 (height > last)
            // 满足上述条件则必定存在洼地
			if (height > last && status == -1) {
				count++;
			}
            // 平地情况,将平地状态转换为上一次上下坡的状态
			if (height == last) {
                // 上一次是下坡就转换为下坡
				if (status == -1)
					status = -1;
                // 上一次是上坡就转换为上坡
				if (status == 1)
					status = 1;
			} else if (height > last)// 高度自然上升情况
				status = 1;
			else// 高度自然下降情况
				status = -1;
			last = height;
		}
		System.out.println(count);
	}
}

        

        到此就分享完了,如果小伙伴有更好的方法也可以评论,一起加油!
        

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值