2020/12/05
A.井字棋
题意:现在有一个 3*3 的棋盘,上面只有一些黑棋(至多有六个黑棋)。 等概率随机地往棋盘中放入三个白棋,求这三个白棋刚好属于同一行或同一列或同一对角线的概率。每组测试数据由三行组成,每行由一个长度为 3 的字符串组成,描述一个棋盘的情况。"X"代表黑棋,"."代表此位置没有棋。保证字符串仅包含以上两种字符。假设概率化为最简分式为 a/b,输出一行由空格隔开的两个整数 a b 代表答案。特别地,如果概率为 0,只输出一行一个整数 0 即可。
题解:统计有多少个位置可以放白棋n和三个白棋刚好属于同一行或同一列或同一对角线的情况cnt,总的摆放的情况有 种,只有最后同时除以最大公约数化成最简分式。
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll gcd(ll a,ll b){ if(b==0){ return a; } return gcd(b,a%b); } int main(){ string s[5]; ll n=0,ans=1,cnt=0; for(int i=0;i<3;i++){ cin>>s[i]; for(int j=0;j<3;j++){ if(s[i][j]=='.'){ n++; } } } if(n<3){ cout<<0<<endl; return 0; } for(int i=n;i>=n-2;i--){ ans=ans*i; } ans=ans/6; if(s[0][0]==s[0][1]&&s[0][1]==s[0][2]&&s[0][0]=='.'){ cnt++; } if(s[1][0]==s[1][1]&&s[1][1]==s[1][2]&&s[1][0]=='.'){ cnt++; } if(s[2][0]==s[2][1]&&s[2][1]==s[2][2]&&s[2][0]=='.'){ cnt++; } if(s[0][0]==s[1][0]&&s[2][0]==s[1][0]&&s[1][0]=='.'){ cnt++; } if(s[0][1]==s[1][1]&&s[2][1]==s[1][1]&&s[1][1]=='.'){ cnt++; } if(s[0][2]==s[1][2]&&s[2][2]==s[1][2]&&s[1][2]=='.'){ cnt++; } if(s[0][0]==s[1][1]&&s[1][1]==s[2][2]&&s[0][0]=='.'){ cnt++; } if(s[0][2]==s[1][1]&&s[1][1]==s[2][0]&&s[0][2]=='.'){ cnt++; } if(cnt==0){ cout<<0<<endl; return 0; }else{ cout<<cnt/gcd(cnt,ans)<<" "<<ans/gcd(cnt,ans)<<endl; } }
B:字符串魔法(easy)
题意:选择一个字典序不递增的子串, 然后使得这个子串变成字典序不递减的子串,即变成形如AAA...AAABBB...BBB这样的字符串。 他想知道,在他至多使用一次魔法后,这个字符串能够出现的最长的字典序不递减的子串的长度为多少。
题解:求相邻的两个AA...BB...字串的最大距离,如果只有一个这样的子串,直接输出这个子串的长度
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<cmath> using namespace std; int b[200010]; int main(){ int n,cnt=0,k=0; string s; cin>>n>>s; for(int i=0;i<n;){ cnt=0; while(s[i]=='A'){ i++; cnt++; } while(s[i]=='B'){ i++; cnt++; } b[k++]=cnt; } int maxx=-1; if(k==1){ cout<<b[0]<<endl; return 0; } for(int i=0;i<k-1;i++){ maxx=max(b[i]+b[i+1],maxx); } cout<<maxx<<endl; return 0; }
D:字符串判断
题意:给出两个长度不超过 50 的仅包含小写字母的字符串,判断是否两个字符串是否存在相同的字符 如果有,则输出 yes,否则输出 no
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int main(){ int flag=0; string s1,s2; cin>>s1>>s2; for(int i=0;i<s1.length();i++){ for(int j=0;j<s2.length();j++){ if(s1[i]==s2[j]){ flag=1; break; } } if(flag) break; } if(flag){ cout<<"yes"<<endl; }else{ cout<<"no"<<endl; } return 0; }
H:变换
题意:从前有一个数字 1,它每天要么 +1,要么 *2,现在它变成了 n,请问它最少用了几天变成 n
题解:可以把数字减1或除2,考虑把n变成1最少需要几步
#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main(){ int n,cnt=0; while(scanf("%d",&n)!=EOF){ cnt=0; while(n!=1){ if(n&1){ n--; cnt++; }else{ n=n/2; cnt++; } } cout<<cnt<<endl; } return 0; }

浙公网安备 33010602011771号