Problem 2103 Bin & Jing in wonderland

Accept: 221    Submit: 1175
Time Limit: 1000 mSec    Memory Limit : 32768
KB

Problem Description

Bin has a dream that he and Jing are both in a wonderland full of beautiful
gifts. Bin wants to choose some gifts for Jing to get in her good graces.

There are N different gifts in the wonderland, with ID from 1 to N, and all
kinds of these gifts have infinite duplicates. Each time, Bin shouts loudly, “I
love Jing”, and then the wonderland random drop a gift in front of Bin. The
dropping probability for gift i (1≤i≤N) is P(i). Of cause, P(1)+P(2)+…+P(N)=1.
Bin finds that the gifts with the higher ID are better. Bin shouts k times and
selects r best gifts finally.

That is, firstly Bin gets k gifts, then sorts all these gifts according to
their ID, and picks up the largest r gifts at last. Now, if given the final list
of the r largest gifts, can you help Bin find out the probability of the
list?

Input

The first line of the input contains an integer T (T≤2,000), indicating
number of test cases.

For each test cast, the first line contains 3 integers N, k and r (1≤N≤20,
1≤k≤52, 1≤r≤min(k,25)) as the description above. In the second line, there are N
positive float numbers indicates the probability of each gift. There are at most
3 digits after the decimal point. The third line has r integers ranging from 1
to N indicates the finally list of the r best gifts’ ID.

Output

For each case, output a float number with 6 digits after the
decimal points, which indicates the probability of the final list.

Sample Input

4
2 3 3
0.3 0.7
1 1 1
2 3 3
0.3 0.7
1 1 2
2 3 3
0.3 0.7
1 2 2
2 3 3
0.3 0.7
2 2 2

Sample Output

0.027000
0.189000
0.441000
0.343000 
 
题意:给定N个礼物和每个礼物获得的概率P(i),编号从1到N,并且每个礼物都可以无限的获取,编号数越大代表礼物越好,Bin拿到了k个礼物,他从中挑出了r件最好的礼物送给朋友,现在只给出那最好的r个礼物,穷尽所有可能的情况,问Bin有多少的可能性最后挑出的那r个礼物就是题设给定的那r个礼物。
思路:切入点可以是题设给定的那r个礼物中编号最小的那个礼物,首先找到这个礼物z,之后考虑未确定的那k-r个礼物应该如何选取,那么未确定的那r个礼物可能是礼物z,也可能是编号比礼物z还小的礼物的组合,这里就需要分类讨论了,每次确定好礼物z在前面k-r个礼物中出现的个数I(I出现个数取值范围:0~k-r),这样再把k个礼物分成两部分来考虑,一部分是编号全小于礼物z的礼物,其余的是另一部分。
对于编号全小于礼物z的礼物,记每种礼物概率为P(a1),P(a2)...P(am),现在假设题设给定的r+I个礼物占的r+I个位置已经确定,那么剩余的k-r-I个空位都需要由编号全小于礼物z的礼物来填补,每个空位可以用这些礼物中任意一个来填补,所以全概率即为:
(P(a1)+P(a2)+...+P(am))^(k-r-I),每一个括号的含义为每个空位可以由礼物a1,a2,...,am中任意一个来填补,系数含义即为要填补(k-r-I)个空位。
再考虑题设给定的r个礼物和我们每次确定的I个礼物z,这些礼物是什么已经确定,累乘(r+I)个礼物的概率得到u,现在只是他们是在哪个位置是不固定的,我们可以随意的调换位置,这时就是一个不可放回的排列组合问题,确定这些礼物所有可能的位置后得到概率all_position,all_position*u就是后一部分礼物的概率,将前后两部分分别得到的可能性相乘就是最终的概率。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
const int N_MAX = ;
int N, k, r;
double P[N_MAX];
int res[N_MAX];
int num[N_MAX];
ll C[][];
void C_table(){
for (int i = ; i < ;i++) {
C[i][] = C[i][i] = ;
for (int j = ; j < i;j++) {
C[i][j] = C[i-][j] + C[i-][j-];
}
}
} double all_position() {
double ans = ;
int number = k;
for (int i = ; i <= N;i++) {//把所有已经知道的数放进k个位置中相应的位置所有的放法
if (num[i]) {
ans *= C[number][num[i]];
number -= num[i];
}
}
return ans;
} int main() {
int T;
scanf("%d",&T);
C_table();//组合排列查询表
while (T--) {
memset(num,,sizeof(num));
scanf("%d%d%d",&N,&k,&r);
for (int i = ; i <= N;i++)
scanf("%lf",&P[i]);
double u = ,p=,ans=;
for (int i = ; i <= r; i++) {
scanf("%d", &res[i]);
num[res[i]]++;//记录该礼物的数量
u *= P[res[i]];//把已知的那些礼物的概率累乘得到的是一种情况下这些礼物的放置位置,再乘上所有可能的放置位置就得到这部分礼物概率
}
sort(res+,res+r+);
for (int i = ; i < res[];i++) {//把编号比res[1]还小的礼物的概率全部累加
p += P[i];
} for (int i = r; i <=k;i++) {
if (i > r) {
u *= P[res[]];
num[res[]]++;
}
ans += u*pow(p, k - i)*all_position(); }
printf("%.6lf\n",ans);
}
return ;
}

FZOJ Problem 2103 Bin & Jing in wonderland的更多相关文章

  1. FZU - 2103 Bin & Jing in wonderland

    FZU - 2103 Bin & Jing in wonderland 题目大意:有n个礼物,每次得到第i个礼物的概率是p[i],一个人一共得到了k个礼物,然后按编号排序后挑选出r个编号最大的 ...

  2. Bin & Jing in wonderland(概率,组合数学)

    Problem 2103 Bin & Jing in wonderland Accept: 201    Submit: 1048 Time Limit: 1000 mSec    Memor ...

  3. FZOJ Problem 2219 StarCraft

                                                                                                        ...

  4. FZOJ Problem 2150 Fire Game

                                                                                                        ...

  5. FZOJ Problem 2148 Moon Game

                                                                                                  Proble ...

  6. FZOJ Problem 2107 Hua Rong Dao

                                                                                                        ...

  7. FZOJ Problem 2110 Star

                                                                                                        ...

  8. UVa 102 - Ecological Bin Packing(规律,统计)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  9. UVa - 102 - Ecological Bin Packing

    Background Bin packing, or the placement of objects of certain weights into different bins subject t ...

随机推荐

  1. SVN:The working copy is locked due to a previous error (一)

    使用 Cornerstone  时,碰到如题问题,SVN无法Update.Commit等操作. 解决办法:Working Copies ⟹ '右键' ⟹ Clean 即可解决! 尊重作者劳动成果,转载 ...

  2. js中实现杨辉三角

    实现效果:杨辉三角 即: 提示用户输入要实现的杨辉三角行数: 请输入杨辉三角的行数: 8 代码实现后的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 ...

  3. Falsy Bouncer-freecodecamp算法题目

    Falsy Bouncer(过滤数组假值) 要求 删除数组中的所有假值.(在JavaScript中,假值有false.null.0."".undefined 和 NaN.) 思路 ...

  4. skimage学习(一)

    skimage即是Scikit-Image.基于python脚本语言开发的数字图片处理包 skimage包由许多的子模块组成,各个子模块提供不同的功能.主要子模块列表如下: data子模块学习 导入d ...

  5. iPhone如何设置自定义铃声?无需连接电脑,轻松几步就搞定!

    转载自: https://baijiahao.baidu.com/s?id=1594988016778457969&wfr=spider&for=pc 受够了iPhone自带的千篇一律 ...

  6. JQuery 在线编辑器和手册

    JQuery 在线编辑器 JQuery 在线编辑器 JQuery 菜鸟教程 手册 JQuery 菜鸟教程 手册

  7. apply 与 lambda

    Python中的lambda和apply用法  https://blog.csdn.net/anshuai_aw1/article/details/82347016

  8. 使用Github第一节

    学习Github 1.目的: 借助github托管代码 2.基本概念(1): 仓库(Repository) 仓库用来存放项目代码,每个项目对应一个仓库,多个项目则对应多个仓库 收藏(Start) 收藏 ...

  9. python寻找模块的路径顺序

    >>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/Versions/3. ...

  10. exp分析

    1 from pwn import* 2 3 local =1 4 debug = 1 5 6 if local: 7 p = process('./pwn1') 8 else: 9 p = remo ...