e531 - 10415 - Eb Alto Saxophone Player
題目描述
題目描述了 Eb Alto Saxophone 的指法,並給定一串音符序列,要求計算每個手指按鍵的次數。每個手指對應的按鍵範圍在題目中給出,音符之間的手指狀態是持續的,除非下一個音符不需要該手指。
解題思路
程式碼使用一個布林陣列 f[11] 來追蹤每個手指是否按住按鍵。對於輸入的每個音符,程式碼根據音符的種類,更新 f 陣列和對應手指按鍵次數的陣列 ans[11]。對於每個音符,程式碼會檢查哪些手指需要按下,如果該手指目前沒有按下,則將其標記為按下,並增加對應手指的按鍵次數。如果該手指目前已經按下,則保持其狀態。對於下一個音符,程式碼會檢查哪些手指不需要按下,並將其標記為釋放。最後,程式碼輸出每個手指的按鍵次數。
複雜度分析
- 時間複雜度: O(n*m),其中 n 是音符序列的長度,m 是手指的數量 (10)。因為對於每個音符,程式碼需要遍歷所有手指。
- 空間複雜度: O(1),因為程式碼使用的額外空間是固定的,不隨輸入大小變化。
f和ans陣列的大小都是固定的 (11)。
程式碼
#include <iostream>
using namespace std;
int c;
string a;
bool f[11];
int main(){
cin >> c;
getline(cin,a);
while(c--){
getline(cin,a);
int al=a.length(),ans[11]={0};
for(int i=0;i<al;++i){
if(a[i]=='c'){
for(int j=1;j<=10;++j){
if(j==1||j==5||j==6)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='d'){
for(int j=1;j<=10;++j){
if(j==1||j==5||j==6||j==10)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='e'){
for(int j=1;j<=10;++j){
if(j==1||j==5||j==6||j==9||j==10)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='f'){
for(int j=1;j<=10;++j){
if(j==1||j==5||j==6||j==8||j==9||j==10)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='g'){
for(int j=1;j<=10;++j){
if(j!=2&&j!=3&&j!=4)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='a'){
for(int j=1;j<=10;++j){
if(j!=2&&j!=3)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='b'){
for(int j=1;j<=10;++j){
if(j!=2)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='C'){
for(int j=1;j<=10;++j){
if(j!=3)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='D'){
for(int j=1;j<=10;++j){
if(j==5||j==6||j==10)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='E'){
for(int j=1;j<=10;++j){
if(j==5||j==6||j==9||j==10)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='F'){
for(int j=1;j<=10;++j){
if(j==5||j==6||j==8||j==9||j==10)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='G'){
for(int j=1;j<=10;++j){
if(j>4)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='A'){
for(int j=1;j<=10;++j){
if(j>3)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
else if(a[i]=='B'){
for(int j=1;j<=10;++j){
if(j>2)f[j]=0;
else{
if(f[j]==0){
f[j]=1;
++ans[j];
}
}
}
}
}
for(int i=1;i<=10;++i){
f[i]=0;
cout << ans[i];
if(i!=10) cout << " ";
}
cout << "\n";
}
}