樹的直徑學習筆記(DFS)
阿新 • • 發佈:2020-12-06
A - Chord
題意:給定3個音符判斷是大三重奏還是小三重奏。
題解:因為給定的數很少,所以其實只要把他們都枚舉出來排列下就好。
程式碼:
#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #include <string> #include <map> using namespace std; const int maxn=1000+5; map<string,int>m; int judge(stringa,string b,string c) { int x=(m[b]-m[a]+12)%12; int y=(m[c]-m[b]+12)%12; int z=(m[c]-m[a]+12)%12; if(x==4&&y==3&&z==7) return 1; if(x==3&&y==4) return 0; return -1; } int main() { m["C"]=1; m["C#"]=2; m["D"]=3; m["D#"]=4; m["E"]=5; m["F"]=6; m["F#"]=7; m["G"]=8; m["G#"]=9; m["A"]=10; m["B"]=11; m["H"]=12; string a,b,c; cin>>a>>b>>c; if(judge(a,b,c)==1||judge(a,c,b)==1||judge(b,a,c)==1||judge(b,c,a)==1||judge(c,a,b)==1||judge(c,b,a)==1) cout<<"major"; else if(judge(a,b,c)==0||judge(a,c,b)==0||judge(b,a,c)==0||judge(b,c,a)==0||judge(c,a,b)==0||judge(c,b,a)==0) cout<<"minor"; else cout<<"strange"; return 0; }
B - Keyboard
題意:就是給出的鍵盤中都是小寫字母,然後給出一串字串計算用到另一隻手的最少次大寫的字母,如果在shift鍵以x為邊長的正方形周圍就可以用一隻手搞定,然後如果是鍵盤中沒有的字母或者打不出大寫的字母就輸出-1。
程式碼:
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <list> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <iostream> using namespace std; map<int,int> m1,m2; char a[35][35]; char b[500010]; int main() { int n,m,x; scanf("%d%d%d",&n,&m,&x); for(int i=0;i<n;i++) { scanf("%s",a[i]); } bool flag1=false; bool flag2=false; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]=='S') { flag1=true; for(int c=0;c<n;c++) { for(int d=0;d<m;d++) { if((c-i)*(c-i)+(d-j)*(d-j)<=x*x&&a[c][d]!='S') m1[a[c][d]-'a']=1; } } } else m2[a[i][j]-'a']=1; } } int cnt=0; int y; scanf("%d%s",&y,b); for(int i=0;i<y;i++) { if(b[i]>='A'&&b[i]<='Z') { if(!flag1) { flag2=true; break; } if(m1[b[i]-'A']!=0){} else if(m2[b[i]-'A']!=0) cnt++; else { flag2=true; break; } } else if(m2[b[i]-'a']) {} else { flag2=true; break; } } if(flag2) puts("-1"); else printf("%d\n",cnt); return 0; }