首页 > 其他 > 详细

[BZOJ1426] 收集邮票

时间:2019-05-03 13:08:40      阅读:130      评论:0      收藏:0      [点我收藏+]

题目链接

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] 收集邮票

原文:https://www.cnblogs.com/hbyer/p/10804705.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!