试题编号: 201604-1
试题名称: 折点计数
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述
  给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天和第6天是折点。

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

问题链接:CCF201604-1 折点计数
问题简述:(略)
问题分析
  重写解题博客以及解题程序代码(参见参考链接),解题逻辑更加清晰,解题代码更加简洁,多种语言解法。
解法一:数组处理
  把需要处理的数据读入到程序中的数组里,然后再进行处理,是一种最为常见的做法。每3个数就可以判定是否有折点,n个数需要做n-2次判定。折点有两种,一种是中间点值最大,另外一种是中间点值最小。循环语句for的结束判定尽量不要有表达式,可以避免程序没有进行优化编译时,出现多余的计算。
解法二:输入流处理
  如果要求不允许使用数组,则需要使用更高的编程技巧。本来程序的输出是字符流,通过函数scanf()和格式"%d"读入整数,将其转换为整数流,再对整数流进行处理,一边判定折点,一边进行统计。
对输入数据按输入流进行处理,可以不使用数组等变量或只使用简单变量。技巧比较高一些,是职业程序员应该掌握的技巧和解题思路,习惯了也就好了。
解法三:多重流箭头流
  这种解法是笔者最早写的题解,被许多人认为难懂,确实是难懂了一些。但是,难懂的东西,往往是因为编程技巧高了一些,过程有点复杂,思路与一般人所想有所不同。
  输入n个数的话,就有n-1个相邻的数可以进行比较,得出向上或向下(相邻2天不相等)的结果(箭头)。对于n-1个箭头,将其看成是一个输入流,相邻的箭头可以进行n-2次比较来判定折点。箭头可以编码为0和1。以下输入样例:
7
5 4 1 2 3 6 4
相邻2个数进行比较,可以得出箭头流如下:
DOWN DOWN UP UP UP DOWN
用0和1进行编码得序列如下:
0 0 1 1 1 0
对以上序列进行折点计算即可。

这里也给出解题的Python语言程序和Java语言程序,以上各种解法都是有的。
程序说明:(略)
参考链接
CCF201604-1 折点计数(100分)
题记:(略)

100分的C语言程序(解法一:数组处理)如下:

/* CCF201604-1 折点计数 */#include <stdio.h>#define N 1000
int a[N];int main()
{int n, i;scanf("%d", &n);for (i = 0; i < n; i++) scanf("%d", &a[i]); /* 读入数据 *//* 判定折点并统计 */int cnt = 0;for (i = 2; i < n; i++)if (a[i - 2] < a[i - 1] && a[i - 1] > a[i]) cnt++;else if (a[i - 2] > a[i - 1] && a[i - 1] < a[i]) cnt++;printf("%d\n", cnt); /* 输出结果 */return 0;
}

100分的C语言程序(解法二:输入流处理)如下:

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

100分的C语言程序(解法三:多重流箭头流)如下:

/* CCF201604-1 折点计数 */#include <stdio.h>#define UP 1
#define DOWN 0int main(void)
{int n, first, second, prearrow, arrow, cnt = 0, i;scanf("%d%d%d", &n, &first, &second); /* 读入n,读入前2个数 */prearrow = second > first ? UP : DOWN; /* 计算箭头方向 */first = second;for ( i = 3; i <= n; i++ ) { /* 读入第3至第n个数 */scanf("%d", &second);arrow = second > first ? UP : DOWN; /* 计算箭头方向 */if (arrow != prearrow) cnt++; /* 判定折点并统计 */prearrow = arrow;first = second;}printf("%d\n", cnt); /* 输出结果 */return 0;
}

100分的Python语言程序(解法一:数组处理)如下:

#  CCF201604-1 折点计数n = int(input())
nums = [int(num) for num in input().split()]
cnt = 0
for i in range(n - 2):if (nums[i] < nums[i + 1] and nums[i + 1] > nums[i + 2]) or (nums[i] > nums[i + 1] and nums[i + 1] < nums[i + 2]) :cnt += 1
print(cnt)

100分的Java语言程序(解法一:数组处理)如下:

/* CCF201604-1 折点计数 */import java.util.Scanner;public class Main {public static void main(String args[]){Scanner sc = new Scanner(System.in);int n = sc.nextInt();int a[] = new int[n];for (int i = 0; i < n; i++) a[i] = sc.nextInt();int cnt = 0;for (int i = 2; i < n; i++)if (a[i - 2] < a[i - 1] && a[i - 1] > a[i]) cnt++;else if (a[i - 2] > a[i - 1] && a[i - 1] < a[i]) cnt++;System.out.print(cnt);}
}

CCF201604-1 折点计数(100分)【序列处理】相关推荐

  1. CSP201604折点计数100分+俄罗斯方块100分题解

    1.折点计数: #include<bits/stdc++.h> using namespace std; int main(){int n;cin>>n;int a[1010] ...

  2. CCF201604-1 折点计数(解法二)(100分)(废除!!!)

    试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长,而后一天 ...

  3. CCF201604-1 折点计数(100分)

    试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长,而后一天 ...

  4. CCF201509-1 数列分段(100分)【序列处理】

    试题编号: 201509-1 试题名称: 数列分段 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? ...

  5. CCF201703-1 分蛋糕(100分)【序列处理】

    试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别 ...

  6. CCF201612-1 中间数(100分)【序列处理+排序】

    试题编号: 201612-1 试题名称: 中间数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在一个整数序列a 1, a 2, -, a n中,如果存在某个数,大于它的整数 ...

  7. CCF201412-1 门禁系统(100分)【序列处理】

    试题编号: 201412-1 试题名称: 门禁系统 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个 ...

  8. CCF201409-1 相邻数对(100分)【序列处理】

    试题编号: 201409-1 试题名称: 相邻数对 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 ...

  9. CCF201403-1 相反数(100分)【序列处理】

    试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 ...

最新文章

  1. 深度解析iPhone Category用法
  2. Linux使用tcpdump抓取网络数据包示例
  3. php 三方即时通讯_php即时通讯解决方案-请问PHP能否实现即时通讯?
  4. C# 操作线程的通用类[测试通过]
  5. javascript表单处理相关的知识总结(一)
  6. 专访vivo X27产品经理:以技术进步为根 以用户需求为本
  7. Ring3加载驱动源码
  8. Mac新手必看教程,苹果电脑基本使用操作,苹果电脑基本操作
  9. 4g模块Linux拨号ppp脚本,在ARM-linux上实现4G模块PPP拨号上网【转】
  10. 职称英语计算机考试取消,职称英语考试取消了吗
  11. 图像处理: 可见光波长(wavelength)与RGB之间的转换
  12. IPhoneX全屏适配
  13. 华为云存储服务分享文件的方法
  14. 功能测试(六)—— APP测试之互联网公司的必备知识
  15. Java Web实用开发技术
  16. python像素鸟游戏
  17. DOS命令CD D:\ 不管用,怎么进入D盘
  18. c蔚语言艺术,晚唐张乔诗歌的语言艺术与美学风格-中国社会科学网.PDF
  19. 显示器接口_显示器USB接口的作用是什么?为什么会没有反应?
  20. 相关公式如下:v=at;s=1/2*a*t2;其中v是速度,a是加速度,t是时间,s是距离。编写程序计算该飞机的加速度。

热门文章

  1. python3socket非阻塞在linux里无效_利用Python中SocketServer实现客户端与服务器间非阻塞通信方法介绍...
  2. RPG Maker的引擎分析(一)(二)
  3. GID绘图和CDC类
  4. 计算机管理主要是作业管理和什么管理,计算机四级之作业管理试题
  5. Hive中类SQL语言中的where 与having
  6. ✨Shell脚本实现Base64 加密解密
  7. 详解:MySQL数据库的权限管理和运维实操
  8. SparkSQL Catalog的作用和访问Hive元数据信息
  9. Spark常用算子讲解一
  10. linux6.4添加源,RHEL6.4更改为CentOS源