2019 ICPC North American Qualifier Contest G. Research Productivity Index

链接

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

题意

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

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

思路

f i , j f_{i,j} fi,j i i i 篇文章中 j j j 篇 的生产指数, p i , j p_{i,j} pi,j i i i 篇文章中 j j j 篇的概率,期望 E i = ∑ j = 1 i f i , j p i , j E_{i}=\sum_{j=1}^if_{i,j}p_{i,j} Ei=j=1ifi,jpi,j

为了让概率尽可能大,将文章按中的概率从大到小排序, p i , j = p i − 1 , j ( 1 − a i ) + p i − 1 , j − 1 a i p_{i,j}=p_{i-1,j}(1-a_i)+p_{i-1,j-1}a_i pi,j=pi1,j(1ai)+pi1,j1ai

最终答案为 max ⁡ i = 1 n { E i } \max_{i=1}^n\{E_i\} maxi=1n{Ei}

代码

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值