/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

回到顶部