1. 程式人生 > 實用技巧 >可樂【簡單期望】

可樂【簡單期望】

題意

\(k\) 種可樂,每種可樂會給小美和小團帶來不同的可樂程度。現在共有 \(n\) 瓶可樂,每種可樂可以買無限瓶,小美會挑選其中的 \(m\) 瓶,而剩下的 \((n-m)\) 瓶小團喝。求出每種可樂各買多少瓶,使得小美和小團得到的快樂程度的和期望值最大。

\(1\leq n \leq 10000, 0 \leq m \leq n, 1 \leq k \leq 10,000, -10,000 \leq a, b \leq 10,000\)

題目連結:https://ac.nowcoder.com/acm/problem/16037

分析

假設第 \(i\) 瓶可樂買了 \(x_i\) 瓶,那麼對於答案最後的貢獻為:\(x_i(\frac{m}{n}·a_i+\frac{(n-m)}{n}·b_i)\)

,可以發現後面部分是確定的。因此,我們只需要求出那種可樂貢獻最大,然後只買這一種可樂即可。

程式碼

#include <bits/stdc++.h>

using namespace std;
int main()
{
    int n,m,k,a,b;
    scanf("%d%d%d",&n,&m,&k);
    double p=1.0*m/n,maxn=-1000000.0;//由負數
    int pos=0;
    for(int i=1;i<=k;i++)
    {
        scanf("%d%d",&a,&b);
        double tp=p*a+(1.0-p)*b;
        if(tp>=maxn)
        {
            pos=i;
            maxn=tp;
        }
    }
    for(int i=1;i<=k;i++)
        printf("%d%c",i==pos?n:0,i==k?'\n':' ');
    return 0;
}