P1317 低洼地[入门]

https://www.luogu.com.cn/problem/P1317
涉及知识点:模拟
入门题
思路:
一.枚举每一个高度,并分成下降段和上升段。
二.输出ans-2 //因为首尾多算了2个
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,a[100001],ans,k;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    int i=1;
    while(i<=n){
        while(a[i]<=a[i-1]&&i<=n) i++;//1
        while(a[i]>=a[i-1]&&i<=n) i++;//2
        ans++;//一段完了多一个答案
    }
    printf("%d",ans-2);//最开始与最后都算了所以减掉
    return 0;
}

方法2

思路:去重

#include<iostream>
#include<string>
using namespace std;
int nu[10521];
int main(void){
    int n,i,p,ans = -1;
    cin>>n;
    for(i=0;i<n;i++){
        cin>>p;
        if(i&&p==nu[i-1]){i--;n--;continue;}
        nu[i] = p;
    }/*输入时,删掉前后高度相同的,合并为一个山峰*/
    for(i=1;i<n-1;i++)
        if(nu[i-1]<nu[i]&&nu[i]>nu[i+1])ans++;
    cout<<ans;
    return 0;
}

方法3

代码;

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int a, b, ans=0, l=0,n;
    cin >>n>>a;                 //建立一个n,输入    后面跟第一个数字,
    for (int i = 1; i <= n; i++)//for循环在未满足长度时继续循环
    {
        cin >> b;               //输入第二个数字
        if (b < a) {            //当b<a的时候,就是左坡高于b
            l = 1;              //使l=1做标记
        }
        if (b > a&&l == 1) {   //当第二个输入的b大于a时,就是右坡高于中间
            ans++; l = 0;      //使答案+1,标记用的l变为0
        }
        a = b;                 //让a=b(就是一个重新赋值)下方有图
    }
    cout << ans;               //当全部结束后,输出可能形成水洼的个数
}

   

执行a=b之后

然后再一次输入b

 

posted @ 2022-07-05 14:37  -イレイナ  阅读(135)  评论(0)    收藏  举报