杭电OJ——2050——赶火车

一共四道题,我把四道题都看完了,按通过率和通过人数权衡决定下手第一题,题目描述:

小伙伴们愉快地结束了暑假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;
}

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/89225059