正题
所有关都是要至少获得一颗星的,所以打关有两种方案,一种是等到赢就放弃,一种是等到两颗星才放弃。
等到赢的时候还是有可能等到两颗星的。而且我们要按照YiYiYi从大到小来排序DpDpDp,这个可以通过观察DpDpDp式子发现,YiYiYi大的时候取到两个星的期望会小,而且等到赢就放弃的时候取到两颗星的概率也会变大,具体来说就是优先冲那先YiYiYi大的。
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
long double f[N][N];
pair<int,int> a[N];
int n,m;
int main(){
scanf("%d %d",&n,&m);m-=n;
int x,y;
for(int i=0;i<n;i++) scanf("%d %d",&a[i].second,&a[i].first);
for(int i=0;i<n;i++) swap(a[i].first,a[i].second);
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
f[i][j]=1e10;
f[n][m]=0;
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++){
f[i][j]=min(f[i][j],min(1000.0/(a[i].first+a[i].second)+f[i+1][j]*a[i].first/(a[i].first+a[i].second)+f[i+1][j+1]*a[i].second/(a[i].first+a[i].second),
1000.0/a[i].second+f[i+1][j+1]));
}
f[i][m]=min(f[i][m],1000.0/(a[i].first+a[i].second)+f[i+1][m]);
}
printf("%Lf\n",f[0][0]);
}
博客围绕51nod闯关展开,指出所有关至少要获一颗星,打关有等到赢就放弃和等到两颗星才放弃两种方案。还提到赢时仍可能获两颗星,且要按Yi从大到小对Dp排序,因Yi大时取两颗星期望小、赢后获两颗星概率大,应优先冲Yi大的关。
490

被折叠的 条评论
为什么被折叠?



