1. 程式人生 > >A Dangerous Maze(n次獨立重複試驗之幾何分佈)

A Dangerous Maze(n次獨立重複試驗之幾何分佈)

題意

有n扇門,對應n個數,其中有正數有負數,你現在開始挑。

挑中正數等對應時間就可以出去,負數的話就等對應絕對值時間,清除記憶然後重挑。

問出去的時間期望,寫成p/q的最簡分數形式。

題解

由於清除記憶,顯然是n次獨立重複試驗。

全是負數顯然出不去,輸出inf。

這樣,每次實驗能出去的概率p=num/n,num為正數個數。

則E(ξ)=1/p,ξ為第一次出去所用的次數。

先不考慮能不能出去,等概率抽中某一個數,則單次實驗等的平均時間T是(\sum abs(a[i]))/n

那麼,經過期望的平均後,意味著,我等E(ξ)次一定能出去。

則等的期望時間=E(ξ)*T,化簡之後即為(\sum abs(a[i])/num

求一下gcd約為最簡即可。

程式碼實現

#include <iostream>
#include <algorithm> 
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <bitset> 
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-7;
typedef long long ll;
#define vi vector<int> 
#define si set<int>
#define pii pair<int,int> 
#define pi acos(-1.0)
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std;
int t,sum,num;
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
} 
int main()
{
	sci(t);
	rep(k,1,t)
	{
		sum=0;num=0;
		int n;
		sci(n);
		rep(i,0,n-1)
		{
			int v;
			sci(v);
			if(v>0)sum+=v,num++;
			else sum-=v;
		}
		int tmp=gcd(sum,num);
		sum/=tmp,num/=tmp;
		printf("Case %d: ",k);
		if(num==0)puts("inf");
		else printf("%d/%d\n",sum,num);
	} 
   	return 0;
}