match

博弈

在这里插入图片描述

思路

此题是要"求 a>b 的概率,a=b 的概率,a<b 的概率的最简整数比"。
大体思路分为三部分:1.求个数;2.求概率    ;3.求最简整数比。
第一步是现将在A,B队列中 a>b , a=b , a<b 的个数求出来;第二步是求a>b,a=b,a<b的个数在总排列组合中的概率。三个概率分母一样 (都是 ps/m*n,pe/m*n,pb/m*n) 所以可以直接求ps ,pe, pb 的最简整数比;第三步是求出 ps:pe:pb 的最简整数比。

实现

first step ——求个数

用for 循环来统计a>b......的个数

for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i]>b[j]) ps++;
if(a[i]==b[j]) pe++;
if(a[i]<b[j]) pb++;
}
}

second step —— 求三个数的最大公约数

int fun(int a,int b) {
int r;
do {
r=a%b;
a=b;
b=r;
} while(r!=0);
return a;
}

总代码

*#include
#include
#include
using namespace std;
/*ifstream fin(“c://test//match//match9.in”);
ofstream fout(“c://test//match//match9.out”);
*/
int n,m;
long long a[100005],b[100005];
//因为输入范围超出了整型范围,所以要用long long

long long ps,pe,pb;
//因为输入范围超出了整型范围,所以要用long long
int fun(long long a,long long b) {
long long r;
do {
r=a%b;
a=b;
b=r;
} while(r!=0);
return a;
}
int main() {
#ifdef LOCAL
//输入重定向,输入数据将从c盘根目录下的in.txt文件中读取
freopen(“c:\BJZHC0\match2.in”, “r”, stdin);
//输出重定向,输出数据将保存在c盘根目录下的out.txt文件中
freopen(“c:\BJZHC0\match2.out”, “w”, stdout);
#endif
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
for(int i=1; i<=m; i++) {
cin>>b[i];
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i]>b[j]) ps++;
if(a[i]==b[j]) pe++;
if(a[i]<b[j]) pb++;
}
}
long long t;
t=fun(ps,pe);
t=fun(t,pb);
cout<<ps/t<<" “<<pe/t<<” “<<pb/t<<” "<<endl;
#ifdef LOCAL
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
#endif
}*

错点

int t;
if((ps!=0)&&(pe!=0)&&(pb!=0)) {
t=fun(ps,pe);
//cout<<“ps:”<<ps<<" “<<“pe:”<<pe<<” "<<“pd:”<<pd<<endl;
//cout<<“t1:”<<t<<endl;
t=fun(t,pb);
//cout<<“t2:”<<t<<endl;
} else if((ps0)&&(pe!=0)&&(pb!=0)) {
t=fun(pe,pb);
//cout<<“t1:”<<t<<endl;
} else if((pe
0)&&(ps!=0)&&(pb!=0)) {
t=fun(ps,pb);
//cout<<“t1:”<<t<<endl;
} else if((pb==0)&&(pe!=0)&&(ps!=0)) {
t=fun(pe,ps);
//cout<<“t1:”<<t<<endl;
}

AC代码

*#include
#include
#include
using namespace std;
/*ifstream fin(“c://test//match//match9.in”);
ofstream fout(“c://test//match//match9.out”);
*/
int n,m;
int a[100005],b[100005];
int ba[100005],bb[100005];
int ps,pe,pb;
/*int change(int x,int y,int z) {
for(int i=2; i<=(max(ps,max(pe,pb))); i++) {
if(x%i0&&y%i0&&z%i0) {
x=x/i;
y=y/i;
z=z/i;
}
}
//cout<<(max(ps,max(pe,pb)));
fout<<x<<" “<<y<<” “<<z<<” "<<endl;
}
*/
int fun(int a,int b) {
int r;
do {
r=a%b;
a=b;
b=r;
} while(r!=0);
return a;
}
int main() {
#ifdef LOCAL
//输入重定向,输入数据将从c盘根目录下的in.txt文件中读取
freopen(“c:\BJZHC0\match2.in”, “r”, stdin);
//输出重定向,输出数据将保存在c盘根目录下的out.txt文件中
freopen(“c:\BJZHC0\match2.out”, “w”, stdout);
#endif
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
for(int i=1; i<=m; i++) {
cin>>b[i];
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i]>b[j]) ps++;
if(a[i]b[j]) pe++;
if(a[i]<b[j]) pb++;
}
}
int t;
if((ps!=0)&&(pe!=0)&&(pb!=0)) {
t=fun(ps,pe);
//cout<<“ps:”<<ps<<" “<<“pe:”<<pe<<” "<<“pd:”<<pd<<endl;
//cout<<“t1:”<<t<<endl;
t=fun(t,pb);
//cout<<“t2:”<<t<<endl;
} else if((ps
0)&&(pe!=0)&&(pb!=0)) {
t=fun(pe,pb);
//cout<<“t1:”<<t<<endl;
} else if((pe
0)&&(ps!=0)&&(pb!=0)) {
t=fun(ps,pb);
//cout<<“t1:”<<t<<endl;
} else if((pb==0)&&(pe!=0)&&(ps!=0)) {
t=fun(pe,ps);
//cout<<“t1:”<<t<<endl;
}
cout<<ps/t<<" “<<pe/t<<” “<<pb/t<<” "<<endl;
#ifdef LOCAL
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
#endif
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值