您的位置:首页 > 其它

LightOJ - 1027 (期望基础)

2017-10-13 22:23 351 查看

LightOJ - 1027 (期望基础)

题目链接:LightOJ - 1027

题目大意: 给你n个门,每次进每个门的概率都是一样的,正数代表你x分钟后可以离开这里,负数代表你x分钟后回到这里。求预期离开的时间, 如果时间无限大,输出inf。

数据范围: 1≤abs(xi)≤10000

解题思路:

用E表示离开所需要的时间。考虑两种情况:

选了正数, 概率为1n, 期望为1k∗ni, 结束。

选了负数, 概率为1n,xi分钟之后回到原点, 那么期望为1n∗(E+xi)

如果正数个数为0, 答案为inf。

否则期望为E=(a1+a2+...+acnt1)n+(b1+b2+..+bcnt2+E∗cnt2)n

其中ai是正数, bi是负数的绝对值, cnt1,cnt2分别是正数和负数的个数。

最后化简结果:E=sumcnt1, cnt1是正数的个数,sum是∑ni=1xi。

代码:

/********************************************
*Author*        :��ZZZZone
*Created Time*  : 五 10/13 18:48:36 2017
* Ended  Time*  : 五 10/13 18:54:58 2017
*********************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;
int T, n, Case;

int gcd(int a, int b){
if(!b) return a;
else return gcd(b, a % b);
}

int main()
{
scanf("%d", &T);
while(T--){
scanf("%d", &n);
int cnt = 0, sum = 0;
for(int i = 1; i <= n; i++){
int x;
scanf("%d", &x);
if(x > 0) cnt++;
sum += abs(x);
}
printf("Case %d: ", ++Case);
if(cnt == 0) printf("inf\n");
else{
int Gcd = gcd(sum, cnt);
printf("%d/%d\n", sum / Gcd, cnt / Gcd);
}
}

return 0;
}


在此输入正文
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lightoj 期望