zoukankan      html  css  js  c++  java
  • CCF201604-1 折点计数(解法二)(100分)

    试题编号: 201604-1
    试题名称: 折点计数
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天和第6天是折点。

      给定n个整数a1, a2, …, an表示销售量,请计算出这些天总共有多少个折点。
      为了减少歧义,我们给定的数据保证:在这n天中相邻两天的销售量总是不同的,即ai-1≠ai。注意,如果两天不相邻,销售量可能相同。
    输入格式
      输入的第一行包含一个整数n。
      第二行包含n个整数,用空格分隔,分别表示a1, a2, …, an
    输出格式
      输出一个整数,表示折点出现的数量。
    样例输入
    7
    5 4 1 2 3 6 4
    样例输出
    2
    评测用例规模与约定
      所有评测用例满足:1 ≤ n ≤ 1000,每天的销售量是不超过10000的非负整数。


    问题链接:CCF201604试题

    问题描述:先输入一个十进制整数n,再输入n个正整数,求它们相邻数之差可知是否为上升或下降,由上升转下降或由下降转上升为折点,求折点数。

    问题分析:有两种解法,第2种是根据评论建议增加的。

    1.这个问题需要2次计算,先计算相邻值之差,以便知道目前趋势(上升或下降);然后再用相邻的趋势进行比较,求出折点的数量。把n个数过一遍即可,但是需要记忆之前的销售量和差值(趋势)。

    2.如果一个点的值比左右两个都大或都小,则为折点。

    程序说明

    这里写了C语言和C++语言两个版本的程序。

    本程序采用第2种解法。程序中使用变量(left, mid, right)是关键,没有用数组存储数据,需要付出点时间代价。


    参见:CCF201604-1 折点计数


    提交后得100分的C语言程序如下:

    /* CCF201604-1 折点计数 */
    
    #include <stdio.h>
    
    int main(void)
    {
        int n, left, mid, right, sum=0;
    
        // 输入n,输前2个数
        scanf("%d", &n);
        if(scanf("%d%d", &left, &mid) != EOF) {
            for(int i=3; i<=n; i++) {
                // 输入第3至第n个数
                scanf("%d", &right);
    
                // 判定是否为折点
                if(left < mid && mid > right)
                    sum++;
                else if(left > mid && mid < right)
                    sum++;
    
                left = mid;
                mid = right;
            }
        }
    
        // 输出结果
        printf("%d
    ", sum);
    
        return 0;
    }


    提交后得100分的C++语言程序如下:

    /* CCF201604-1 折点计数 */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n, left, mid, right, sum=0;
    
        // 输入n,输前2个数
        cin >> n;
        if(cin >> left >> mid) {
            for(int i=3; i<=n; i++) {
                // 输入第3至第n个数
                cin >> right;
    
                // 判定是否为折点
                if(left < mid && mid > right)
                    sum++;
                else if(left > mid && mid < right)
                    sum++;
    
                left = mid;
                mid = right;
            }
        }
    
        // 输出结果
        cout << sum << endl;
    
        return 0;
    }

     

  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564216.html
Copyright © 2011-2022 走看看