博弈
思路
此题是要"求 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((pe0)&&(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((ps0)&&(pe!=0)&&(pb!=0)) {
t=fun(pe,pb);
//cout<<“t1:”<<t<<endl;
} else if((pe0)&&(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
}