不同VLAN下實現網路互相通訊
阿新 • • 發佈:2020-12-06
A - Chord
題意:就是環中有12個字元,給你三個字元,判斷他們之間的間隔,如果第一個和第二個間隔是3並且第二個和第三個間隔是4,那麼就輸出minor,如果第一個和第二個間隔是4並且第二個和第三個間隔是3,那麼就輸出major,否則輸出strange
思路:用一個數組a中相對位置存入1,因為1個迴圈是12,讓你判斷的總長度是7,所以不會產生干擾,直接進行a[i]、a[i+3]、a[i+7]判斷即可
程式碼:
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5View Code#include<cstring> 6 using namespace std; 7 int main(){ 8 //C, C#, D, D#, E, F, F#, G, G#, A, B,H 9 string s[28]={"0","C","C#","D","D#","E","F","F#","G","G#","A","B","H"}; 10 string s1; 11 string s2; 12 string s3; 13 cin>>s1; 14 cin>>s2; 15 cin>>s3;16 int flag=0; 17 int flag1=0,flag2=0,flag3=0; 18 for(int i=1;i<=12;i++){ 19 if(s1==s[i]){ 20 flag1=i; 21 } 22 if(s2==s[i]){ 23 flag2=i; 24 } 25 if(s3==s[i]){ 26 flag3=i; 27 } 28 } 29 int a[50]={0}; 30a[flag1]=1; 31 a[flag2]=1; 32 a[flag3]=1; 33 a[flag1+12]=2; 34 a[flag2+12]=2; 35 a[flag3+12]=2; 36 for(int i=0;i<30;i++){ 37 if(a[i]!=0&&a[i+3]!=0&&a[i+7]!=0){ 38 flag=1; 39 break; 40 } 41 if(a[i]!=0&&a[i+4]!=0&&a[i+7]!=0){ 42 flag=2; 43 break; 44 } 45 } 46 if(flag==1){ 47 printf("minor"); 48 }else if(flag==2){ 49 printf("major"); 50 }else{ 51 printf("strange"); 52 } 53 }
B - Keyboard
題意:題目中給定一種特殊的矩陣鍵盤,S是可以讓小寫字母變成大寫字母,如果S和給定字母的小寫字母在一定範圍內,則用一個手輸出,否則用兩隻手輸出,問至少多少次用兩隻手輸出
思路:一開始想著就是直接存,然後先找到距離內的字元做好標記,直接看看給定的字串中有多少個在這個未標記的範圍內,結果這樣是錯的,其實未標記的字母可能也存在於已標記的範圍中,所以應該以已標記的為主要對比物件
程式碼:
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 int main(){ 8 int n,m,x,d; 9 scanf("%d %d %d",&n,&m,&d); 10 char s[60][60]; 11 int xx[4000][2]; 12 int flag=0; 13 getchar();//存入 14 for(int i=0;i<n;i++){ 15 for(int j=0;j<m;j++){ 16 scanf("%c",&s[i][j]); 17 if(s[i][j]=='S'){ 18 xx[flag][0]=i; 19 xx[flag][1]=j; 20 flag++; 21 } 22 } 23 getchar(); 24 } 25 int t; 26 int ss[60][60]; 27 for(int i=0;i<60;i++){ 28 for(int j=0;j<60;j++){ 29 ss[i][j]=0; 30 } 31 } 32 scanf("%d",&t); 33 string tt; 34 getchar(); 35 getline(cin,tt); 36 for(int i=0;i<flag;i++){ 37 int x,y; 38 x=xx[i][0]; 39 y=xx[i][1]; 40 ss[x][y]=1; 41 for(int ii=0;ii<n;ii++){ 42 for(int j=0;j<m;j++){ 43 long int st=0; 44 st=(ii-x)*(ii-x)+(j-y)*(j-y); 45 if(st<=d*d){ 46 ss[ii][j]=1; 47 } 48 } 49 50 } 51 } 52 int p=0; 53 if(flag==0){ 54 p=1; 55 }//標記這是沒有shift鍵的 56 int sum=0; 57 int flag1=0; 58 int ds=0; 59 for(int i=0;i<t;i++){ 60 int flagg=0; 61 if(tt[i]>='A'&&tt[i]<='Z'){ 62 ds++; 63 int ff=0,f=0; 64 for(int ii=0;ii<n;ii++){ 65 f=0; 66 for(int jj=0;jj<m;jj++){ 67 if(tt[i]-'A'+'a'==s[ii][jj]&&ss[ii][jj]==1){ 68 f=1; 69 break; 70 } 71 if(tt[i]-'A'+'a'==s[ii][jj]&&ss[ii][jj]==0){ 72 ff=1; 73 } 74 if(tt[i]-'A'+'a'==s[ii][jj]){ 75 flagg++; 76 } 77 } 78 if(f==1){ 79 break; 80 } 81 } 82 if(f==1){ 83 continue; 84 }else if(ff==1){ 85 sum++; 86 } 87 if(flagg==0){ 88 flag1=1; 89 } 90 }else{ 91 for(int ii=0;ii<n;ii++){ 92 for(int jj=0;jj<m;jj++){ 93 if(tt[i]==s[ii][jj]){ 94 flagg++; 95 } 96 } 97 } 98 if(flagg==0){ 99 flag1=1; 100 } 101 } 102 } 103 if((flag1==1)||(ds>0&&p==1)){ 104 printf("-1\n"); 105 }else{ 106 printf("%d\n",sum); 107 } 108 109 }View Code
C - Trains
題意:其實就是問,在兩個數的最小公倍數內,誰的商更大一些,但是最小公倍數的最後一次要給除數大的那邊,也就是說除數小的那個數的商要減1,然後比較大小分別輸出相應的內容
思路:直接找最小公倍數以及商就好了
程式碼:
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 long long int cm(long long int a,long long int b){ 8 if(a==b){ 9 return a; 10 } 11 if(a>b){ 12 a-=b; 13 cm(a,b); 14 }else{ 15 b-=a; 16 cm(a,b); 17 } 18 } 19 int main(){ 20 long long int a,b,c; 21 scanf("%lld %lld",&a,&b); 22 c=(a*b)/(cm(a,b)); 23 long long int num1=c/a,num2=c/b; 24 if(a>b){ 25 num2-=1; 26 } 27 if(b>a){ 28 num1-=1; 29 } 30 if(num1>num2){ 31 printf("Dasha"); 32 }else if(num1<num2){ 33 printf("Masha"); 34 }else{ 35 printf("Equal"); 36 } 37 38 }View Code