CCF CSP 201604-1 折点计数(Java-100分)


试题编号: 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的非负整数。


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

问题分析

方法一:如果一个点的值比左右两个都大或都小,则为折点。(较费存储空间)

方法二:顺序遍历,记录当前数和下一个数,并标记当前数列是递增还是递减,若当前是递增,下一个数比当前数小,即为拐点;若当前为递减序列,下一个数比当前数大,即为拐点。相较于方法一,较省空间,但程序逻辑性较强。


提交后得100分的Java语言程序如下:(方法一)(注意提交时去掉注释,否则容易引起编译错误)

import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		int num = 0;

		Scanner sc = new Scanner(System.in);

		int n = Integer.valueOf(sc.nextLine());
		int[] a = new int[n];

		for (int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}

		for (int i = 1; i < n - 1; i++) {
			if ((a[i - 1] > a[i] && a[i] < a[i + 1] )|| (a[i - 1] < a[i] && a[i] > a[i + 1]) ){
				num++;
			}

		}
		System.out.println(num);

		sc.close();
	}
}

提交后得100分的Java语言程序如下:(方法二)(注意提交时去掉注释,否则容易引起编译错误)
public class Main {

	public static void main(String[] args) {

		int n;
		int pre = -1;// 前一个数
		int aft = -1;// 后一个数
		int pre_state = 0;// 标定上一次的状态-1表示递减 1表示递加
		int now_state = 0;// 标定本次的状态-1表示递减 1表示递加
		int num = 0;// 折点个数

		Scanner sc = new Scanner(System.in);

		n = Integer.valueOf(sc.nextLine());

		for (int i = 0; i < n; i++) {
			if (pre == -1) {
				pre = sc.nextInt();
			} else if (aft == -1) {
				aft = sc.nextInt();
				if (aft - pre > 0) {
					pre_state = 1;
				} else {
					pre_state = -1;
				}
				pre = aft;// 记录变化
			} else {
				aft = sc.nextInt();
				if (aft - pre > 0) {
					now_state = 1;
				} else {
					now_state = -1;
				}
				if (now_state != pre_state) {
					num++;
					pre_state = now_state;
				}
				pre = aft;// 记录变化
			}
		}

		System.out.println(num);

		sc.close();
	}
}






发布了128 篇原创文章 · 获赞 238 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/daijin888888/article/details/76854050