"科林明伦杯"哈理工第九届——分布式服务(概率期望+思维)

题目描述
小赵实习时负责的服务模块由多个实例共同组成,当出现一个请求时,反向代理会将请求随机的转发到一个实例上进行处理。由于网络波动等原因,请求可能出现超时的情况,这时候,客户端会进行重试,请求会再一次随机转发到某个实例。重复这个过程,直到请求处理完成。
通过监控报表,小赵能够了解到某个时间段内服务模块内所有实例的情况。每个实例有一个处理时间t,如果时间t为正数则代表这个实例能够花费t 的时间完成请求的处理,而如果时间t为负数,则代表这个请求需要等待abs(t) 的时间重试。为了评估服务质量的好坏,小赵决定计算一下,一个请求处理成功所花费时间的期望。

输入
本题有多组数据,处理到文件结束。
每组数据一个整数n代表服务模块的实例数量。(1<=n<=100)
接下来一行n个整数代表上文描述中每个实例的t。(1<=abs(t)<=10000))

输出
每组数据输出"p/q"代表以分数表示期望的值,p为分子,q为分母,p和q需互质(如1/2代表二分之一)。如果请求无法处理完成,请输出"inf"。
样例输入 Copy
1
1
2
-1 -2
3
3 -6 -9
样例输出 Copy
1/1
inf
18/1
提示
在概率论和统计学中,数学期望(mean)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。----摘自百度百科

先放一波代码~

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int main(){
    int n;
    while(~scanf("%d",&n)){
        int t;
        int cnt = 0;
        int sum = 0;
        while(n--){
            cin>>t;
            if(t>=0) cnt++;
            sum += abs(t);
        }
        if(cnt==0)  cout<<"inf"<<endl;
        else
            cout<<sum/gcd(sum,cnt)<<"/"<<cnt/gcd(sum,cnt)<<endl; 
    }
    return 0;
}

数学期望的解释及公式请到百度百科~
先大体理解下题意吧:现在有多个服务模块,但是质量有好有坏,有的实例能够处理请求,而有的实例则会延迟一段时间后给其他服务器处理。问一个请求处理成功所花费的时间。

我们可以设一个请求成功处理的期望为E,在所有的实例里处理时间t为负数的服务器数量为x,那么每台实例处理请求的概率是1/n。所以如果该请求是从质量好的实例处理成功的话,期望为ti,否则,期望为E+abs(ti);
可得到以下推导:

E =sum(Ei) / n Ei为各个实例处理完成的期望
E = (sum(abs(ti))+k*E) / n ti为各个实例的t
E = sum(abs(ti)) / (n-k)

注意题目要求输出最简分式,再将计算结果同除最大公约数即可。

最后放两道关于概率期望的待补题
题目链接 CodeForces 453A 题解
计蒜客蓝桥杯训练 炮台实验 题解

原文地址:https://www.cnblogs.com/OvOq/p/14853224.html