题意:
你在一个迷宫里,面前有n扇们,每个门有一个数字k;
如果k为正数,则通过这扇门,走k分钟就能出去,
如果为负数,则通过这扇门走-k的分钟回到迷宫;
走每扇门概率一样.问走出迷宫所需时间的期望值;
思路:
首先如果全是负数肯定是inf;
然后我们假设我们走出去的期望时间是d;
那么拿第三个样例举例子; d = 1/3 * 3 + 1/3( 6 + d) + 1/3 (9 + d);
意思就是每扇门被选择的概率是1/3;选选第一扇门要花3分钟出去,选第二扇门要6 + d(花6分钟返回原地,在花期望d出去);
然后根据这个式子求出d;并用分数表示;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct frac{ int u; int d; }f; frac add(frac a, frac b) { if(a.d == 0) return b; frac tmp; int up = a.u * b.d + a.d * b.u; int down = a.d * b.d; int c = __gcd(up, down); tmp.u = up / c; tmp.d = down / c; return tmp; } int main() { int t, n; int cas = 1; scanf("%d",&t); while(t--) { scanf("%d",&n); int d = 0; frac num; num.u = 0; num.d = 0; int tmp; for(int i = 0; i < n; i++) { scanf("%d",&tmp); if(tmp > 0) { f.u = tmp; f.d = n; num = add(num, f); }else { f.u = -tmp; f.d = n; num = add(num, f); d++; } } if(d == n) { printf("Case %d: inf\n",cas++); continue; } num.u *= n; num.d *= (n - d); int c = __gcd(num.u, num.d); printf("Case %d: %d/%d\n",cas++, num.u / c, num.d / c); } }
时间: 2024-10-24 16:14:58