1. 程式人生 > >[BZOJ1426] 收集郵票

[BZOJ1426] 收集郵票

return math 得到 還需 -i 選中 還需要 多少 --

題目鏈接

BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=1426

洛谷:https://www.luogu.org/problemnew/show/P4550

Solution

期望題思路就是清奇...

\(f(i)\)表示當前收集了\(i\)張,集滿還需要多少張,顯然\(f(n)=0\)

我們可以枚舉當前這張有沒有選中沒有的,得到:
\[ f(i)=\frac{i}{n}f(i)+\frac{n-i}{n}f(i+1)+1 \]
化簡一下:
\[ f(i)=f(i+1)+\frac{n}{n-i} \]
然後考慮費用,設\(g(i)\)表示當前收集了\(i\)

張,集滿所需的費用,這裏假定當前這張一元錢,後面的以此類推,同樣的\(g(n)=0\)

那麽我們根據上面的思路可以得到:
\[ g(i)=\frac{i}{n}(g(i)+f(i))+\frac{n-i}{n}(g(i+1)+f(i+1))+1 \]
加了\(f(i)\ or\ f(i+1)\)是因為當前多了一張,後面每一張都要多一元錢。

化簡一下:
\[ g(i)=\frac{i}{n-i}f(i)+f(i+1)+g(i+1)+\frac{n}{n-i} \]
直接暴力遞推就好了。當然你可以發現這題不需要開數組

#include<cstdio>
double f1,f2,t,g1,g2;int n;

int main() {
    scanf("%d",&n);
    for(int i=n-1;~i;i--) t=f1+1.0*n/(n-i),f2=f1,f1=t,t=1.0*i/(n-i)*f1+g1+f2+1.0*n/(n-i),g2=g1,g1=t;
    printf("%.2lf\n",g1);
    return 0;
}

[BZOJ1426] 收集郵票