同題:UVa 11764 – Jumping Mario
瑪莉歐 (Mario) 在最後的城堡。他現在需要跳過一些牆壁,然後進入庫巴 (Koopa) 的房間,他要打敗怪物,以拯救公主。對於這個問題,我們只關注“翻過牆”的一部分。你將被給予 N 個牆壁 (由左至右) 的高度。瑪莉歐 (Mario) 目前站在第一個牆壁。他必須跳到相鄰的牆壁直到最後一個。這意味著,他將跳躍 N – 1 次。「a high jump」代表瑪莉歐 (Mario) 跳到一個較高的牆,同樣,「a low jump」代表瑪莉歐 (Mario) 跳到一個較矮的牆。你能找出 a high jump 和 a low jump 的總數嗎?
範例測資
範例輸入 | 範例輸出 |
---|---|
第一行輸入的是一個整數 T (T < 30),表示接下來有 T 筆測資。每筆測資開始於一個正整數 N (N < 50),表示牆壁的數目。下一行依序為 N 個牆壁的高度 (由左至右)。每一個高度是不超過 10 的非負整數。 | 對每筆測資先輸出這是第幾筆測資,接下來兩個數代表「high jumps」和「low jumps」的總數。 |
3 8 1 4 2 2 3 5 3 4 1 9 5 1 2 3 4 5 | Case 1: 4 2 Case 2: 0 0 Case 3: 4 0 |
解題思路
收資料的之前先宣告一個 current 變數,代表目前採的牆壁高度。收資料的時候,先判斷目前收到的數字是否為數列的第一個數字,如果不是的話就判斷收到的數字是否有比 current 高或低,同樣高度不算,並且都在最後將 current 設為收到的數字。
範例程式碼-ZeroJudge D660: Jumping Mario
#include <iostream>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
for (int i = 0; i<T; i++) {
int N, current = 0, high = 0, low = 0;
cin >> N;
for (int j = 0; j<N; j++) {
int tmp;
cin >> tmp;
if (j != 0) {
if (tmp > current) high++;
else if (tmp < current) low++;
}
current = tmp;
}
cout << "Case " << i+1 << ": " << high << " " << low << "\n";
}
}
//ZeroJudge D660
//Dr. SeanXD