一共四道题,我把四道题都看完了,按通过率和通过人数权衡决定下手第一题,题目描述:
小伙伴们愉快地结束了暑假wannafly训练营的生活,决定返回学校,早上小伙伴们要赶到高铁站,高铁将在y分钟后 停止检票,但他们发现了一件尴尬的事情——他们不认路。
这个城市的道路是非常诡异的,在他们面前有n+m条路,其中n条路是正确的,如果走正确的路,将会在ai分钟后走到高铁站,另外m条路是不正确的,如果走不正确的路,将会在bi分钟后回到起点。
小伙伴们只能随机选择一条路走,但他们记性很差,即使走过一条不正确的路,他们也可能会再次选择这条路。
小伙伴们是非常谨慎的人,他们想要计算到达高铁站所需时间的期望EX,如果EX≤y,那么就出发,否则就退票。
这道题我一开始以为考察的是概率论,最后把公式推导出来以后发现是一道级数的题,就是求等差数列和等比数列的乘积的数项级数之和。
(1): u(n) =[ (n-1)*b+a ] * { n/(m+n) * [ (m/(m+n) ] ^ (n-1) };
其中:a = (a1+a2+…ai+…an)/n, b = (b1+b2+…bi+…bm)/m。
现在应该能看出这道题其实就是一道数学题了吧,因为q<1,所以u(n)数项之和收敛,通过使用这个定理求得:res = a+m/n * b;
代码就很简单了:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#define inf 9999999
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
double n,m,y,a=0,b=0,res;
scanf("%lf%lf%lf",&n,&m,&y);
for(int i=0;i<n;i++){
double t;
scanf("%lf",&t);
a+=t;
}
for(int i=0;i<m;i++){
double t;
scanf("%lf",&t);
b+=t;
}
a /= n;
b /= m;
res = a + m/n*b;
if(res>y){
printf("Wait\n");
}else{
printf("Go\n");
}
}
return 0;
}