A Dangerous Maze(n次獨立重複試驗之幾何分佈)
阿新 • • 發佈:2018-12-11
題意
有n扇門,對應n個數,其中有正數有負數,你現在開始挑。
挑中正數等對應時間就可以出去,負數的話就等對應絕對值時間,清除記憶然後重挑。
問出去的時間期望,寫成p/q的最簡分數形式。
題解
由於清除記憶,顯然是n次獨立重複試驗。
全是負數顯然出不去,輸出inf。
這樣,每次實驗能出去的概率p=num/n,num為正數個數。
則E(ξ)=1/p,ξ為第一次出去所用的次數。
先不考慮能不能出去,等概率抽中某一個數,則單次實驗等的平均時間T是。
那麼,經過期望的平均後,意味著,我等E(ξ)次一定能出去。
則等的期望時間=E(ξ)*T,化簡之後即為,
求一下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; }