開啟章節選單
10415 Eb Alto Saxophone Player
題目連結
題目敘述
你擁有一支 降 E 調中音薩克斯風(Eb Alto Saxophone),在演奏某些樂曲時,你發現手指動得非常頻繁,於是你對「每根手指在整首樂曲中實際按下幾次按鍵」產生了興趣
音符說明:
- 樂曲中的音符來自兩個八度,共 14 種音符:
- 第一個八度: c d e f g a b (小寫)
- 第二個八度: C D E F G A B (大寫)
音符 | 使用手指編號 |
---|---|
c | 2~4 , 7~10 |
d | 2~4 , 7~9 |
e | 2~4 , 7 , 8 |
f | 2~4 , 7 |
g | 2~4 |
a | 2 , 3 |
b | 2 |
C | 3 |
D | 1~4 , 7~9 |
E | 1~4 , 7 , 8 |
F | 1~4 , 7 |
G | 1~4 |
A | 1~3 |
B | 1 , 2 |
輸入說明
第一行輸入一個整數 t( 1 ≤ t ≤ 1000 ),代表總共有幾筆測資 (幾首樂曲)
接下來 t 行,每行是一首樂曲的音符序列 (可能為空)
音符字元只可能是 {c,d,e,f,g,a,b,C,D,E,F,G,A,B}
每首樂曲最多 200 個音符
輸出說明
對於每一筆測資,請輸出 10 個整數,代表每一根手指在這首樂曲中實際按下去的次數
按照手指編號 1 到 10 的順序輸出,中間以 單一空格分隔
解題思路
- 建立音符與手指對應表(音符 -> 手指編號)
- 模擬每一筆旋律的手指按壓過程
- 「按壓」的條件:
- 某手指在 當前音符要使用,但上一個音符沒使用到 ⇒ 要算一次按下
- 第一個音符中用到的手指一律都算一次按下
- 「按壓」的條件:
程式碼
#include <iostream> #include <sstream> #include <unordered_map> #include <vector> using namespace std; int main() { unordered_map<char, vector<int>> mp; mp['c'] = {2, 3, 4, 7, 8, 9, 10}; mp['d'] = {2, 3, 4, 7, 8, 9}; mp['e'] = {2, 3, 4, 7, 8}; mp['f'] = {2, 3, 4, 7}; mp['g'] = {2, 3, 4}; mp['a'] = {2, 3}; mp['b'] = {2}; mp['C'] = {3}; mp['D'] = {1, 2, 3, 4, 7, 8, 9}; mp['E'] = {1, 2, 3, 4, 7, 8}; mp['F'] = {1, 2, 3, 4, 7}; mp['G'] = {1, 2, 3, 4}; mp['A'] = {1, 2, 3}; mp['B'] = {1, 2}; string T; int t; getline(cin, T); stringstream ss; ss << T; ss >> t; for (int i = 0; i < t; i++) { vector<int> cnt(10 + 1, 0); vector<bool> press(10 + 1); string s; getline(cin, s); for (auto ch : s) { for (auto finger : mp[ch]) { if (!press[finger]) { press[finger] = true; cnt[finger] += 1; } else { continue; } } for (int j = 1; j <= 10; j++) { press[j] = false; for (auto finger : mp[ch]) { if (j == finger) { press[j] = true; break; } } } } for (int k = 1; k <= 10; k++) { if (k > 1) cout << " "; cout << cnt[k]; } cout << endl; } return 0; }