2019 ICPC North American Qualifier Contest G. Research Productivity Index

链接

https://ac.nowcoder.com/acm/contest/13168/G

题意

有 $n$ 篇文章,第 $i$ 篇文章中的概率为 $a_i$,定义 $i$ 篇文章中 $j$ 篇的生产指数为 $j^{j/i}$。

现在可以自己选择投哪几篇文章,求生产指数的最大期望。

思路

记 $f_{i,j}$ 为 $i$ 篇文章中 $j$ 篇 的生产指数,$p_{i,j}$ 为 $i$ 篇文章中 $j$ 篇的概率,期望 $E_{i}=\sum_{j=1}^if_{i,j}p_{i,j}$。

为了让概率尽可能大,将文章按中的概率从大到小排序,$p_{i,j}=p_{i-1,j}(1-a_i)+p_{i-1,j-1}a_i$。

最终答案为 $\max_{i=1}^n{E_i}$。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <bits/stdc++.h>
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
typedef double DB;
typedef long double LD;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VPII;
// head
const int N=105;
DB a[N],dp[N][N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],a[i]/=100;
sort(a+1,a+1+n,greater<DB>());
dp[0][0]=1;
for(int i=1;i<=n;i++) dp[i][0]=dp[i-1][0]*(1-a[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]=dp[i-1][j]*(1-a[i])+dp[i-1][j-1]*a[i];
DB res=0;
for(int i=1;i<=n;i++) {
DB sum=0;
for(int j=1;j<=n;j++) sum+=dp[i][j]*pow(j,1.0*j/i);
res=max(res,sum);
}
cout<<fixed<<setprecision(9)<<res<<'\n';
return 0;
}