/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>usingnamespace std;
typedef longlong 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;
return0;
}
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;
return0;
}else{
cout<<cnt/gcd(cnt,ans)<<""<<ans/gcd(cnt,ans)<<endl;
}
}
View Code
B:字符串魔法(easy)
题意:选择一个字典序不递增的子串, 然后使得这个子串变成字典序不递减的子串,即变成形如AAA...AAABBB...BBB这样的字符串。 他想知道,在他至多使用一次魔法后,这个字符串能够出现的最长的字典序不递减的子串的长度为多少。
题解:求相邻的两个AA...BB...字串的最大距离,如果只有一个这样的子串,直接输出这个子串的长度
#include<iostream>#include
<cstring>#include
<string>#include
<cstdio>#include
<cmath>usingnamespace 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;
return0;
}
for(int i=0;i<k-1;i++){
maxx=max(b[i]+b[i+1],maxx);
}
cout<<maxx<<endl;
return0;
}
View Code
D:字符串判断
题意:给出两个长度不超过 50 的仅包含小写字母的字符串,判断是否两个字符串是否存在相同的字符 如果有,则输出 yes,否则输出 no
#include<cstdio>#include
<string>#include
<cstring>#include
<iostream>#include
<algorithm>usingnamespace std;
typedef longlong 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;
}
return0;
}
View Code
H:变换
题意:从前有一个数字 1,它每天要么 +1,要么 *2,现在它变成了 n,请问它最少用了几天变成 n
题解:可以把数字减1或除2,考虑把n变成1最少需要几步
#include<algorithm>#include
<iostream>#include
<cstdio>#include
<cmath>usingnamespace 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;
}
return0;
}
View Code
以上是 /12/05 的全部内容, 来源链接: utcz.com/a/76921.html