概率与期望的一些问题整理
---恢复内容开始---
考了几个期望...一点都不会做...然后就补一补...还是找vjudge上的一些专题做...一些水题,放一起感觉好一点.
Lightoj 1027
题意:
n个门,每个门有一个权值并有两种选择走出去或者只是耗费时间,求期望走出去的时间.
SOL:
第一题还是要打一下的...
很显然我们可以列一个方程然后解一下...
就没了...
/*========================================================================== # Last modified: 2016-03-22 18:19 # Filename: 3680.cpp # Description: ==========================================================================*/ #define me AcrossTheSky #include <cstdio> #include <cmath> #include <ctime> #include <string> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <set> #include <map> #include <stack> #include <queue> #include <vector> #define lowbit(x) (x)&(-x) #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++) #define FORP(i,a,b) for(int i=(a);i<=(b);i++) #define FORM(i,a,b) for(int i=(a);i>=(b);i--) #define ls(a,b) (((a)+(b)) << 1) #define rs(a,b) (((a)+(b)) >> 1) #define getlc(a) ch[(a)][0] #define getrc(a) ch[(a)][1] #define maxn 10010 #define maxm 100000 #define pi 3.1415926535898 #define _e 2.718281828459 #define INF 1070000000 using namespace std; typedef long long ll; typedef unsigned long long ull; template<class T> inline void read(T& num) { bool start=false,neg=false; char c; num=0; while((c=getchar())!=EOF) { if(c=='-') start=neg=true; else if(c>='0' && c<='9') { start=true; num=num*10+c-'0'; } else if(start) break; } if(neg) num=-num; } /*==================split line==================*/ int a[maxn]; int gcd(int x,int y){return y==0?x:gcd(y,x%y);} int main(){ //freopen("a.in","r",stdin); int cas; read(cas); FORP(i,1,cas){ printf("Case %d: ",i); int n; read(n); int t=0,sum=0; FORP(i,1,n) { read(a[i]); t+=abs(a[i]); if (a[i]<=0) sum++; } int down=n-sum; if (down==0) printf("inf\n"); else { int d=gcd(t,down); printf("%d/%d\n",t/d,down/d); } } }
lightoj 1030
题意:
以前见过貌似还写过...倒推很丝帛...代码别人的贴不贴呢...不贴好了...
Lightoj 1038
题意:
白书上的题,感觉跟第一题没什么不一样,不写了...
Lightoj 1079
题意:
抢银行;
现在给出一个概率p,和银行的个数n;
接下去给出每个银行可以抢到的钱,还有抢劫这个银行被抓的概率;
问在被抓的概率小于等于p的情况下,最多抢到多少钱;
SOL:
刚看到还有点懵逼,感觉要不要撞鸭什么的...发现n等于100,有点傻了...想半天没想法看了题解...然后发现钱不超过1w....
那么就可以背包搞了...
这题终于拜托了前面的sb形象...我们把状态记为前i个银行抢j的钱被捕的概率,然后DP即可
不想打代码QAQ...
Lightoj 1248
题意:给一个n个面的骰子,每个面点数出现的概率相同,求扔出所有面的期望次数。
SOL:
感觉画风有点像做的那个鬼畜题....
期望大法...一定要倒着推...
设dp[i]为已经扔出了i个不同面值,还要扔dp[i]次才能扔出n个不同面的期望次数,显然dp[n] = 0,要求dp[0]
则dp[i] = 1+ i/n * dp[i] + (n-i)/n * dp[i+1],本来要扔的一次加上各个状态转移的期望值=>dp[i] = n / (n-i) + dp[i+1]
然而还是感觉丝帛好多...
Lightoj 1265
题意:
在孤岛生存, 孤岛上有t头老虎,d头鹿, 每天会出现随机出现两只生物(包括你自己), 如果出现了一只老虎,那么你将被吃掉, 如果两只老虎, 则两只老虎会同归于尽,其他情况你都将生存下来。
当孤岛上没有老虎时, 就视为你生存成功。
问你生存成功的最大概率。
sol:
感觉没什么好说的...代码比较直观...
Code:
#include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <ctime> #include <set> #include <map> #include <list> #include <queue> #include <string> #include <vector> #include <fstream> #include <iterator> #include <iostream> #include <algorithm> using namespace std; #define LL long long #define INF 0x3f3f3f3f #define MOD 1000000007 #define eps 1e-6 #define MAXN 1010 int t, d; double solve() { double ans = 0.0; if(t % 2 == 1) return ans; ans = 1.0; if(t == 0) return ans; int x = t; while(x) { ans *= 1.0 * (x - 1.0) / (x + 1.0); x -= 2; } return ans; } int main() { int T; int kcase = 0; scanf("%d", &T); while(T --) { scanf("%d %d", &t, &d); printf("Case %d: %.7lf\n", ++ kcase, solve()); } return 0; }