题意:

给n个节点  他们形成了最多10条链  每条最多1000的长度  每一个节点有个val  你能够选择任何位置截断链  断点前的全部节点被你获得  通过题中计算公式得出你的val  问  通过随机截断  获得val的期望是多少

思路:

期望=全部方案val的和/方案数

这里明显有分层的现象  并且每层最多10个元素  因此想到状压  那么我们仅仅要逐层统计  每层计算一下能对“全部方案val的和”产生多少贡献就可以  方案数能够直接算出来  计算方法例如以下

对于方案数  它就等于 (amt[1]+1)*(amt[2]+1)*…  amt[i]为每条链上的节点总数  这个式子就表示对于每条链有amt+1种截断方式  即  一開始就截断+在每一个元素后面截断

对于val的和  我们通过每层的状态来计算(刚才也说了要状态压缩)

假设状压中该位置为1表示选中该元素  那么序列一定是这种111111XXXXXX  即1前面一定都是1  因此相应的方案有amt-层数+1 种

假设该位置为0  那么序列一定是这种 XXXXXXX000000 即0后面一定都是0  那么方案就有 层数 种

知道了那一层所形成的方案数  那么仅仅须要计算一下该层的节点val和与方案数乘一下就能够了

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 10010 int next[N], vis[N], val[N], amt[10], qu[10];
double x, y;
int t, n, m, tot; int main() {
int i, u, v, floor, have, num;
double ways, res;
//freopen("1001.in", "r", stdin);
//freopen("1001.out", "w", stdout);
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
memset(next, 0, sizeof(next));
memset(vis, 0, sizeof(vis));
memset(amt, 0, sizeof(amt));
tot = 0;
x = 1;
y = 0;
for (i = 1; i <= n; i++)
scanf("%d", &val[i]);
for (i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
u++;
v++;
next[u] = v;
vis[v] = 1;
}
for (i = 1; i <= n; i++)
if (!vis[i]) {
qu[tot] = i;
for (u = i; u; u = next[u])
amt[tot]++;
x *= amt[tot] + 1;
tot++;
}
for (floor = 1;; floor++) {
num = 0;
for (i = 0; i < tot; i++)
if (qu[i])
num++;
if (!num)
break;
for (u = 1; u < (1 << tot); u++) {
have = 0;
ways = 1;
res = 0;
for (i = 0; i < tot; i++) {
if (u & (1 << i)) {
if (!qu[i])
break;
res += val[qu[i]];
have++;
ways *= amt[i] - floor + 1;
} else
ways *= min(floor, amt[i] + 1);
}
if (i == tot) {
y += res * ways;
if (have > 1)
y += res * have * ways / num;
}
}
for (i = 0; i < tot; i++)
qu[i] = next[qu[i]];
}
//printf("%.3f %.3f ", y, x);
printf("%.3f\n", y / (x - 1));
}
return 0;
}

HDU 4921 Map的更多相关文章

  1. HDU 4921 Map(状态压缩)

    题意看这篇博客. 思路参考的这篇博客. 补充:面对这种问题有一个常见的套路.比如计算若干个区间对答案的贡献这种问题,直接暴力可能复杂度到O(n ^ 2), 而我们可以计算出每个元素在多少个合法区间中, ...

  2. HDU 4921 Map DFS+状态压缩+乘法计数

    算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久, ...

  3. hdu 1075 (map)

    http://acm.hdu.edu.cn/showproblem.php?pid=1075 What Are You Talking About Time Limit: 10000/5000 MS ...

  4. hdu 1247 map的使用

    http://acm.hdu.edu.cn/showproblem.php?pid=1247 Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    ...

  5. hdu 4941 map的使用

    http://acm.hdu.edu.cn/showproblem.php?pid=4941 给定N,M和K,表示在一个N*M的棋盘上有K个棋子,给出K个棋子的位置和值,然后是Q次操作,对应的是: 1 ...

  6. hdu 2112 HDU Today(map与dijkstra的结合使用)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. HDU 5167(map + 暴力)

    题意:给出一个数n,问n能否是斐波那契数列中数的乘积 先刷选 斐波那契数列,然后就枚举 #include <cstdio> #include <cstring> #includ ...

  8. HDU 1004 MAP【STL__map_的应用】

    强大的MAP,今天终于开始好好学习一次. map内部是用红黑树维持的有序结构. 定义:map<int,string>mapStudent; 查找的时间复杂度为对数级别. 1.构造方法学习两 ...

  9. HDU 4329 MAP(stringstream的用法)

    这个题目有点绕,但是按着他的意思写不难模拟出来.本来是一场学弟们的训练赛,我这个学长在赛场上却WA了四次都没过,三条黑线就一直在我的脑袋上挂着... 赛后开始找原因,后来发现题目看错了,1/R中的R是 ...

随机推荐

  1. git gitk命令

    通过gitk命令,在单独的界面上查看项目源码在各个时间点上的代码提交情况. 各个commit 各个tag ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 更多详细的介绍 ...

  2. [置顶] Android中使用sqlite3操作SQLite

    SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库:  1.将sqlit ...

  3. webservice asmx 无法序列化接口 System.Collections.Generic.IList

    转载自:http://www.cnblogs.com/chenhuzi/p/4178194.html 今天有位同事在方法里加了一个IList<entity> 的返回值,也没有测试,直接发布 ...

  4. DateTime.ParseExact

    今天一个项目到我的机器上后,一句代码:DateTime.Parse("02/10/2014")一直报错,invaild datetime string,猜测是系统时间问题,但是将系 ...

  5. js打印

    js打印,其实是打印当前页面的内容,是调用 系统的js方法,来弹出 打印设置窗口,用法很简单. window.print()就行,有的考虑到 浏览器兼容性问题,会用到document.execComm ...

  6. QObject,有一个生存线程(慢慢体会)

     moveToThread本来就是操作QObject的    比如把当前对象移到主线程里: myObject->moveToThread(QApplication::instance()-> ...

  7. SilkTest Q&A 13

    Q121 :我想要测试 windows2003 上的 remote 应用,但是每次都得到如下的错误 我想要测试 windows2003 上的 remote 应用,但是每次都得到如下的错误: " ...

  8. Android原生APP内分享

    Android原生APP内分享,可实现数据分享以及assets文件夹分享及私有文件分享 项目地址:https://github.com/json-pu/AndroidAppShare.git

  9. iOS开发- 查询项目代码行数

    ...事实上, 这功能也没什么用. 就是查询一个项目总的代码行数. 玩玩倒是能够. 方法: 在终端以下依次输入: cd 项目文件 find . "(" -name "*. ...

  10. Linux 安装ibus极点五笔输入法备忘录

    Linux 安装 ibus 五笔输入法备忘录 useful?: https://github.com/definite/ibus-table-chinese 一. yum install ibus* ...