CCF CSP 201604-1 折點計數(Java-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的非負整數。


問題描述:先輸入一個十進制整數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();
	}
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章