Codeforces Beta Round #73(Div2)
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 }
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 }
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 }

浙公网安备 33010602011771号