bzoj 1426

又是一道期望题。
刷上瘾了QAQ
写题解写得生无可恋:
设f(i)表示已经有了i个之后期望买多少张。
其中f(n) = 0;
f(i) = i / n * f(i) + (n - i) / n * f(i + 1);
解方程,f(i) = f(i + 1) + n / (n - i );
f(i)可解。
g(i,j)表示用j元想去买第i +1张一直买到第n张的花费。
g(i,j) = i / n * g(i,j + 1) + (n - i) / n * g(i + 1,j + 1) +j;
g(n,j) = 0;
仔细一想应该递推就行?
当i = n - 1时
发现是(无穷级数求和)无穷的……
仔细想想应该是求g(0,1);
设pr(x,i)为买x次能从i种买到n种的概率,则改变下原来的式子:
以下{x in [0,inf)}
f(i) = \sigma {x * pr(x,i)} ;
g(i,j) = \sigma {[(j) + (j + 1) + (j + 2) + (j + 3) + …… + (j + x - 1)] * pr(x,i)}
= \sigma {[(2 * j + x - 1) * x / 2] * pr(x,i)}
又有:
g(i,j + 1) = \sigma{『 [2 * j + 1 + x ] * x / 2 』* pr (x,i)}
则g(i,j + 1) - g(i,j) = \sigma{x * pr(x,i)};
回到上面的式子……
= > f(i) = \sigma {x * pr(x,i)} ;
= > g(i,j + 1) - g(i,j) = \sigma{x * pr(x,i)} = f(i);
所以我们可以推出g(i,j)的表达式:
g(i,j) = (i / n) * g(i,j + 1) +g(i + 1,j + 1) * (n - i) / n + j;
g(i,j + 1) = g(i,j) + f(i);
代入:
g(i,j) = (i / n) * [g(i,j) + f(i)] + [g(i + 1,j) + f(i + 1)] * (n - i ) / n + j;
解方程:
定义常量c = [g(i + 1,j) + f(i + 1)] * (n - i ) / n + j;
g(i,j) = (i / n) * g(i,j) + (i / n) * f(i) + c;
[(n - i) / n] * g(i,j) = (i / n) * f(i) + c;
g(i,j) = (i / n) * f(i) * [n / (n - i)]+ c * [n / (n - i)];
g(i,j) = [i / (n - i)] * f(i) + {[g(i + 1,j) + f(i + 1)] * (n - i ) / n + j} * [n / (n - i)];
然后我们发现实际上只需要知道j相同的那些值即可。
仔细一想发现其实……
我们就要求g(0,1),所以倒着计算g(i,1)再计算g(0,1)就可以了。
这里用g[i]表示g(i,1)

/*
以下为程序计算部分:
read(n);//读入 n
f[n] = g[n] = 0;//初始化
For i : n - 1 to 0
    f[i] = f[i + 1] + n / (n - i);//计算f[i]的值
For i : n - 1 to 0
    g[i] =g[i + 1] + f[i + 1]  + (i / (n - i)) * f[i] + n / (n - i);//计算g[i]的值
output : g[0];//输出
*/
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#define Rep(i,n) for(int i = 1; i <= n ; i ++)
#define RepG(i,x) for(int i = head[x] ;~ i ; i = edge[i].next)
#define Rep_d(i,n) for(int i = n ; i > 0 ; i --)
#define Rep_0(i,n) for(int i = 0 ; i < n ; i ++)
#define Rep_d0(i,n) for(int i = n - 1;i >= 0;i --)
#define RD(i,x,n) for(int i = x; i <= n ; i ++)
#define CLR(a,b) memset(a,b,sizeof(a))
#define RDD(i,x,n) for(int i = x; i >= n; i --)
#define lc ch[0]
#define rc ch[1]
#define v edge[i].to
#define ulfc t[u.lc]
#define urtc t[u.rc]
using namespace std;
const int inf = 1 << 30;
typedef long long ll;
int read(){
    char ch = getchar();
    while((ch < '0' || ch > '9') && ch != '-')ch = getchar ();
    int x = 0;
    bool flag = 0;
    if(ch == '-')ch = getchar(),flag = 1;
    while(ch >= '0' && ch <= '9')x = (x << 1) + (x << 3) + ch - '0',ch = getchar ();
    return flag ? -x : x;
}
int n,m;
const int N = 10005;
double f[N],g[N];
int main (){
    n = read();
    Rep_d0(i,n)f[i] = f[i + 1] + 1.0 * n / (n - i);
    Rep_d0(i,n)g[i] = g[i + 1] + f[i + 1]  + (1.0 * i / (n - i)) * f[i] + 1.0 * n / (n - i);
    printf("%.2f\n",g[0]);
    return 0;
}

代码如上。

BZOJ 2908 题目是一个数据下载任务。这个任务要求下载指定的数据文件,并统计文件中小于等于给定整数的数字个数。 为了完成这个任务,首先需要选择一个合适的网址来下载文件。我们可以使用一个网络爬虫库,如Python中的Requests库,来帮助我们完成文件下载的操作。 首先,我们需要使用Requests库中的get()方法来访问目标网址,并将目标文件下载到我们的本地计算机中。可以使用以下代码实现文件下载: ```python import requests url = '目标文件的网址' response = requests.get(url) with open('本地保存文件的路径', 'wb') as file: file.write(response.content) ``` 下载完成后,我们可以使用Python内置的open()函数打开已下载的文件,并按行读取文件内容。可以使用以下代码实现文件内容读取: ```python count = 0 with open('本地保存文件的路径', 'r') as file: for line in file: # 在这里实现对每一行数据的判断 # 如果小于等于给定整数,count 加 1 # 否则,不进行任何操作 ``` 在每一行的处理过程中,我们可以使用split()方法将一行数据分割成多个字符串,并使用int()函数将其转换为整数。然后,我们可以将该整数与给定整数进行比较,以判断是否小于等于给定整数。 最后,我们可以将统计结果打印出来,以满足题目的要求。 综上所述,以上是关于解决 BZOJ 2908 数据下载任务的简要步骤和代码实现。 希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值