给最多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. 【LeetCode】Broken Calculator(坏了的计算器)

    这道题是LeetCode里的第991道题. 题目描述: 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数 ...

  2. POJ-3261 Milk Patterns,后缀数组+二分。。

                                                        Milk Patterns 题意:求可重叠的至少重复出现k次的最长的字串长. 这题的做法和上一题 ...

  3. 好未来谢华亮:AI 在教育行业中的应用

    11 月 23 日,在以「AI 产业技术的渗透与融合」为主题的 NIUDAY 北京站中,好未来 SEG 智慧教育事业部技术总监谢华亮为大家带来了关于「AI 在教育行业中的应用」的分享. 本文是对分享内 ...

  4. BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster ——广义后缀自动机

    给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ...

  5. BZOJ2241 [SDOI2011]打地鼠 【模拟】

    题目 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地 ...

  6. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  7. vue之二级路由

    router-view : <router-view> 组件是一个 functional 组件,渲染路径匹配到的视图组件 一 样式 1 在一个vue组件,<template>& ...

  8. 实验三 kali下metasploit的漏洞攻击实践

    一.实验内容 1.使用kali进行靶机的漏洞扫描,利用metasploit选择其中的一个漏洞进行攻击,并获取权限. 2.分析攻击的原理以及获取了什么样的权限. 二.实验要求 1.熟悉kali原理和使用 ...

  9. 【Vijos1250】最勇敢的机器人(并查集,分组背包DP)

    题意:有N个物品,承重上限为M,有K组物品互斥关系,互斥关系有传递性,即1与2互斥,2与3互斥,1与3也互斥 给出每个物品的花费和价值,求承重上限内的最大价值总和 n<=1000,m<=1 ...

  10. HDU 5009 Paint Pearls(西安网络赛C题) dp+离散化+优化

    转自:http://blog.csdn.net/accelerator_/article/details/39271751 吐血ac... 11668627 2014-09-16 22:15:24 A ...