試題編號: | 201604-1 |
試題名稱: | 折點計數 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述
給定n個整數表示一個商店連續n天的銷售量。如果某天之前銷售量在增長,而後一天銷售量減少,則稱這一天爲折點,反過來如果之前銷售量減少而後一天銷售量增長,也稱這一天爲折點。其他的天都不是折點。如下圖中,第3天和第6天是折點。
爲了減少歧義,我們給定的數據保證:在這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();
}
}