给最多10条链。每条链长度最大1000,链上每点有权值,每条链上按顺序,第i个点属于level[i]。

链上后一个点能够选的前提是前面的点都选了。

选择了一些点能够得到的分数是两部分加起来:1、所有点权和 2、leveli的点共同拥有yi个。若你选择了xi个,则得分:你选择的该层点权和*xi/yi

问全部可能的取值组合的分数期望。

题意太纠结了。读的好心塞,感觉思考能力都下降了。

由于题目是求期望,所以我们须要得到,1、总方案数,2、全部取法的得分和。

对于1,就是(每条链上点数+1)相乘-1就是了

对于问题2,

当中主要要解决得分规则2,因为总共最多10条链,对于每个level i ,我们能够想到用二进制记录第i层状态,枚举第i层的取法,

这样我们的问题就变成了。我们要求每一种取法的得分数,以及在总方案数中。这样的取法占了多少种。

这样还是比較好算的,假如第i层,有第1 3 4 6条链上能够取,你取了1 3上的第i个数。则第4 6条链最多取到第i-1个数。如果第1 3 4 6条链上总共分别有5 6 3 4个点。

那么取1 3的所有方案数就是   (5-1)×(6-3)×min(3,i)×min(4,i) 种。由于1 3链上必须取到第i个数,第i个后面的可选,而第4 6条链仅仅能选前i-1个数,那么这样乘起来就是总方案数。

如今主要问题都攻克了,我们就能够累加得分算出总得分,进而求期望了。

题目的wa点有:点从0開始记数。总方案数用int会爆,直接double就能够了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
const int maxn=10010; int vis[maxn],son[maxn],len[15],val[maxn],level[maxn],mk[maxn],list[15][1005]; double cal(int a,int b)//a表示枚举到第alevel b的二进制位表示levela层可能取哪些链
{
double n=1,sum=0;
int cnt=0;
for(int i=1;i<=10;i++,b>>=1)
{
if(b&1)
{
cnt++;
n*=(len[i]-a);
sum+=list[i][a];
}
else
n*=(min(len[i],a)+1);
}
return sum*((cnt>1?cnt:0)+level[a])/level[a]*n;
} int main()
{
int icy,m,i,n,k,j,a,b;
scanf("%d",&icy);
while(icy--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)//注意点是从0開始编号的。! !
scanf("%lld",&val[i]);
memset(son,-1,sizeof son);
memset(vis,0,sizeof vis);
while(m--)
{
scanf("%d%d",&a,&b);
son[a]=b;
vis[b]=1;
}
//建图记录下面:
int l=1;//求链的总数
memset(mk,0,sizeof mk);//每一个level出如今哪些链中
memset(level,0,sizeof level);//level[i]的点数 //level总数:第一个level[k]==0的k
memset(list,0,sizeof list);//list[i][j]第i条链的第j位置的值
memset(len,0,sizeof len);//每条链的长度
double tot=1;//分母
for(i=0;i<n;i++)
{
if(!vis[i])
{
vis[i]=1;
for(k=0,j=i;j!=-1;j=son[j],k++)
{
list[l][k]=val[j];
level[k]++;
mk[k]+=(1<<(l-1));
}
len[l]=k;
tot*=(k+1);
l++;
}
}
tot-=1;//分母 double sum=0;
for(i=0;level[i];i++)//枚举每一层level
for(j=mk[i];j>0;j=(j-1)&mk[i])//枚举这一层取哪几条链上的全部可能
sum+=cal(i,j);
printf("%.3lf\n",sum/tot);
}
return 0;
}

hdu4921 Map的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  6. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  7. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  8. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  9. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

随机推荐

  1. 树状数组 Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains

    C. Fountains time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. OkHttpUtil

    package jp.co.gunmabank.util import android.os.Handlerimport android.os.Looperimport com.google.gson ...

  3. Method for Estimating the Number of Concurrent Users

    1. Formula for Estimating the Average Number of Concurrent users We begin by defining what the numbe ...

  4. 性能学习笔记之四--事务,思考时间,检查点,集合点和手写lr接口

    一.事物,思考时间,检查点,集合点 1.事务 lr里面的事物是lr运行脚本的基础.lr里面 要测试的三个维度都以事物为单位,所以一定要有事物.事务的概念贯穿loadrunner的使用,比如我们说的响应 ...

  5. BZOJ 1016 [JSOI2008]最小生成树计数 ——Matrix-Tree定理

    考虑从小往大加边,然后把所有联通块的生成树个数计算出来. 然后把他们缩成一个点,继续添加下一组. 最后乘法原理即可. 写起来很恶心 #include <queue> #include &l ...

  6. BZOJ 3473 字符串 ——广义后缀自动机

    这题就比较有趣了. 首先匹配一遍,然后统计子树叶子节点中包含大于等于k的节点个数(HH的项链) 然后就可以搞了. 关于合法的情况数,显然是l[i]-l[fa[i]],然后向下下传即可(YY一下). # ...

  7. 转载: 找不到MSVCR90.dll、Debug vs Release及cppLapack相关

    今天调试程序时出现了,找不到MSCVR90.dll的错误,最好查找到了解决办法,原文链接如下:   http://hi.baidu.com/wpzhao/blog/item/72dc08f77ce9b ...

  8. 学习shell脚本之乘法口诀

    脚本如下: #!/bin/bash for i in 'seq 1 9' do for j in 'seq 1 $i' do k=$[$i*$j] echo -ne "$j"&qu ...

  9. cf670E Correct Bracket Sequence Editor

    Recently Polycarp started to develop a text editor that works only with correct bracket sequences (a ...

  10. mongodb的安装及环境配置

    一 下载 官网:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.6.3-signed.msi 官网可能打不开, ...