zoukankan      html  css  js  c++  java
  • 题解 P1317 【低洼地】

    题目

    这题挺简单的,没必要用数组

    【分析】

    需要判断的是低洼地的数量

    通过对题目中图进行分析,显然可以发现低洼地的定义:

    若数组中存在一个数值相同的连续区间,这个区间端点外相邻两点的数值都大于该区间的数值,则该区间为低洼地

    有的朋友也许会觉得这个定义很麻烦,但有时候,定义是必须的

    比如这题,如果单纯地将低洼地理解为中间都比周围低,那么对于这组数据:

    3 2 1 2 1 2 3
    

    就会被视为一个低洼地,而不是两个了

    我们回来。可以发现,对于 一个数值相同的区间 显得有些无趣,毕竟我们不需要知道区间长度,只需要这个区间的数值

    所以,对于相同的相邻读入,可以直接存为一个

    这样,我们对于我们储存的数据,低洼地的定义就不同了:

    若数组中存在一个数,它既小于它的前一个数,又小于它后一个数,则这个数是低洼地

    我们需要的是低洼地的数量,所以一边读入,一边处理即可

    具体细节可以参考本蒟蒻的代码

    还有一个细节,第一个点和最后一个点一定不是低洼地,可以考虑初始化为上坡,这个可以在本蒟蒻的代码中体现


    【代码】

    那本蒟蒻就放 我码风极丑的 代码了

    #include<cstdio>
    using namespace std;
    int main(){
        int d_T,d_F=-2,d_M=-1,d_L,d_Cnt=0;
        /*
        d_T:数据组数
        d_F:当前数的前一个数
        d_M:当前数
        d_L:当前数的后一个数
        d_Cnt:低洼地的数量
        因为高度保证>=0,初始化为(-2),(-1) 能保证一定是上坡
        */
        scanf("%d",&d_T);
        while(d_T--){
            scanf("%d",&d_L);
            if(d_L==d_M) continue;
            //数值相同,不需要新存
            if(d_M<d_F&&d_M<d_L) d_Cnt++;
            //判断是否是低洼地,是的话记录
            d_F=d_M;
            d_M=d_L;
            //更新
        }
        printf("%d",d_Cnt);
        return 0;
    }
    

    想学读入优化和输出优化的朋友,这里也给出代码,但是对这题没有什么影响

    #include<cstdio>
    using namespace std;
    #define f(a,b,c,d) for(register int a=b,c=d;a<=c;a++)
    #define g(a,b,c,d) for(register int a=b,c=d;a>=c;a--)
    typedef int i32;
    typedef unsigned int u32;
    typedef long long int i64;
    typedef unsigned long long int u64;
    namespace IO{
        //#define LOCAL
        #ifdef LOCAL
            inline char gc() { return getchar(); }
        #else
            inline char gc(){
                static char s[1<<20|1]={0},*p1=s,*p2=s;
                return (p1==p2)&&(p2=(p1=s)+fread(s,1,1<<20,stdin),p1==p2)?EOF:*(p1++);
            }
        #endif
        inline i64 read(){
            register i64 ans=0;register char c=gc();register bool neg=0;
            while(c<48||c>57) neg^=!(c^45),c=gc();
            while(c>=48&&c<=57) ans=(ans<<3)+(ans<<1)+(c^48),c=gc();
            return neg?-ans:ans;
        }
        char Output_Ans[1<<20|1],*Output_Cur=Output_Ans;
        inline void output() { Output_Cur-=fwrite(Output_Ans,1,Output_Cur-Output_Ans,stdout); }
        inline void print(char c){
            if(Output_Cur-Output_Ans+1>>20) output();
            *(Output_Cur++)=c;
        }
        inline void print(i64 ans){
            register char buf[20]={0};
            if(Output_Cur-Output_Ans+sprintf(buf,"%lld",ans)>>20) output();
            Output_Cur+=sprintf(Output_Cur,"%lld",ans);
        }
        inline void print(i32 ans) { print(0ll|ans); }
        inline void print(u64 ans){
            register char buf[20]={0};
            if(Output_Cur-Output_Ans+sprintf(buf,"%llu",ans)>>20) output();
            Output_Cur+=sprintf(Output_Cur,"%llu",ans);
        }
        inline void print(u32 ans) { print(0ull|ans); }
    }
    using namespace IO;
    int main(){
        register i32 d_T=read(),d_F=-2,d_M=-1,d_L,d_Cnt=0;
        while(d_T--){
            d_L=read();
            if(d_L==d_M) continue;
            if(d_M<d_F&&d_M<d_L) d_Cnt++;
            d_F=d_M;
            d_M=d_L;
        }
        print(d_Cnt);
        output();
        return 0;
    }
    

    最后安利一下 本蒟蒻的博客

  • 相关阅读:
    数据库的数据同步
    IDEA连接数据库自动生成实体类
    异常日记(一)
    高16位,低16位是什么
    springboot整合rabbitmq
    springBoot使用教程
    分布式框架Dubbo入门
    Spring注解驱动开发04(给容器中注册组件的方式)
    Spring注解驱动开发03(按照条件注册bean)
    Spring注解驱动开发02(作用域和懒加载)
  • 原文地址:https://www.cnblogs.com/JustinRochester/p/12286888.html
Copyright © 2011-2022 走看看