# Greedy# String Manipulation# Array

e531 - 10415 - Eb Alto Saxophone Player

🔗 前往 ZeroJudge 原題

題目描述

題目描述了 Eb Alto Saxophone 的指法,並給定一串音符序列,要求計算每個手指按鍵的次數。每個手指對應的按鍵範圍在題目中給出,音符之間的手指狀態是持續的,除非下一個音符不需要該手指。

解題思路

程式碼使用一個布林陣列 f[11] 來追蹤每個手指是否按住按鍵。對於輸入的每個音符,程式碼根據音符的種類,更新 f 陣列和對應手指按鍵次數的陣列 ans[11]。對於每個音符,程式碼會檢查哪些手指需要按下,如果該手指目前沒有按下,則將其標記為按下,並增加對應手指的按鍵次數。如果該手指目前已經按下,則保持其狀態。對於下一個音符,程式碼會檢查哪些手指不需要按下,並將其標記為釋放。最後,程式碼輸出每個手指的按鍵次數。

複雜度分析

  • 時間複雜度: O(n*m),其中 n 是音符序列的長度,m 是手指的數量 (10)。因為對於每個音符,程式碼需要遍歷所有手指。
  • 空間複雜度: O(1),因為程式碼使用的額外空間是固定的,不隨輸入大小變化。fans 陣列的大小都是固定的 (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";
	}
}

Discussion