其他分享
首页 > 其他分享> > Google kick start 2018 Round A - Lucky Dip

Google kick start 2018 Round A - Lucky Dip

作者:互联网

题目链接

这个题当时就思路错掉了,样例都推不出来,看来想进google数学得过关。

题意就是给你一堆有权值的球,每次等概率拿一个,可以放回,有K次机会,求最大期望。其实我当时根本没在意最大期望和那句“如果你第K次拿了,那你就只能留在手里了”,看了官方分析才知道,这两句话有大用,不然就是求期望,而不是最大期望,吃了没文化的亏。思路是这样:第一次拿球有一个期望E[0] =\frac{\sum Vi}{N} ,后面每一个放回拿球的期望E[i]都是要和前一次的期望做对比的,因为如果我第二次拿球拿的值还不如上一次的期望值高那我还拿干什么,所以E[i] = \frac{\sum min(Vi,E[i-1]]))}{n}。说实话,如果这个推不出来这个题小样例都过不去。太南了。


#include<bits/stdc++.h>
using namespace std;
double num[2*10240];
double sum[2*10240];
double E[5*10240];
int main()
{
    int testcase;
    cin >> testcase;
    for(int kase = 1;kase<=testcase;kase++)
    {
    	memset(num,0,sizeof(num));
    	memset(E,0,sizeof(E));
    	int n,K;
    	cin >> n >> K;
    	for(int i = 0;i < n;i++)
    		cin >> num[i];
		sort(num,num + n);
		sum[0] = num[0];
		for(int i = 1;i < n;i++)
    		sum[i] = num[i] + sum[i-1];
    	for(int i = 0;i < n;i++)
    		E[0] += num[i];
    	E[0] /= n;
    	for(int i = 1;i <= K;i++)
    	{
    		int ind = lower_bound(num,num+n,E[i-1]) - num;
    		E[i] += ind * E[i-1];
    		//cout << E[i] << endl; 
    		E[i] += sum[n-1]-sum[ind-1];
    		//cout << E[i] << endl;
    		E[i] /= n;
    		//cout << E[i] << endl; 
		}
    	printf("Case #%d: %.6lf\n",kase,E[K]);
	}
    return 0;
}

 

标签:Google,期望,int,sum,Lucky,start,num,10240,拿球
来源: https://blog.csdn.net/zjbh89757/article/details/100114474