開啟章節選單
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 <vector> #include <unordered_map> 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; }