"科林明伦杯"哈理工第九届——分布式服务(概率期望+思维)
题目描述
小赵实习时负责的服务模块由多个实例共同组成,当出现一个请求时,反向代理会将请求随机的转发到一个实例上进行处理。由于网络波动等原因,请求可能出现超时的情况,这时候,客户端会进行重试,请求会再一次随机转发到某个实例。重复这个过程,直到请求处理完成。
通过监控报表,小赵能够了解到某个时间段内服务模块内所有实例的情况。每个实例有一个处理时间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 题解
计蒜客蓝桥杯训练 炮台实验 题解