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;
    }
}
View Code

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;
}
 
View Code

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;
}
View Code

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;
} 
View Code

 

posted @ 2020-12-13 18:04  Endeavo_r  阅读(264)  评论(0)    收藏  举报