1. 程式人生 > 實用技巧 >不同VLAN下實現網路互相通訊

不同VLAN下實現網路互相通訊

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>
 5
#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}; 30
a[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 }
View Code

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