随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

最开始你有 K 的容积,有 n 轮比赛,

每轮比赛胜率为 pi,比赛分为两种(具体种类有输入给出,若 ai≥1 则为第一种,若 ai=−1ai=1 则为第二种),

第一种的奖品是增加 A[i] 的容积,第二种奖品是获得一个物品,体积为 1,

n 轮比赛结束后所有物品都能被装下的方案才是合法方案(即容积大于等于物品个数),

问赢得比赛总场数大于等于 ll 时方案合法的概率

 

   f[i][j][k] 前i个,胜利场数j,  体积为k 的方案合法的概率

 

 f[i+1][j][k]+= f[i][j][k] *(1-p[i] )

f[i+1][j][k] += f[i][j+1][ min( k+a[i] ,n) ] * p[i ]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
 const int N =203;
  
 struct T{
    int v;
    double p;
 }a[N];
  
 int cmp(T &x,T &y){
    return x.v>y.v;
 }
 double f[N][N][N];
 int n,L,K;
  
 void solve(){
    int i,j,k;
     
    f[0][0][min(n,K)] =1.0;
    for(i=0;i<n;i++)
     for(j=0;j<=i;j++)
      for(k=0;k<=n;k++){
        f[i+1][j][k] += f[i][j][k]*(1-a[i+1].p);
         
        if(k+a[i+1].v>=0)
        f[i+1][j+1][min(k+a[i+1].v,n)]+= f[i][j][k]*a[i+1].p;
      }
       
    double ans= 0;
    for(i=L;i<=n;i++)
     for(j=0;j<=n;j++) ans+=f[n][i][j];
    printf("%0.10lf", ans);
 }
 signed main(){
     cin>>n>>L>>K;
     for(int i=1;i<=n;i++) cin>>a[i].p,a[i].p/=100.0;
     for(int i=1;i<=n;i++) cin>>a[i].v ;
     sort(a+1,a+1+n,cmp);
     solve();
 }

 

posted on   towboat  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示