题意:

给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. lokijs

    http://lokijs.org/#/ 500,000+ 1.1M ops/s. A fast, in-memory document-oriented datastore for node.js, ...

  2. Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识

    第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...

  3. pytesser图片文本识别

    python图片文本识别使用的工具是PIL和pytesser.因为他们使用到很多的python库文件,为了避免一个个工具的安装,建议使用pythonxy,这个工具的介绍可参考baidu. pytess ...

  4. 在大型项目上,Python 是个烂语言吗

    Robert Love, Google Software Engineer and Manager on Web Search. Upvoted by Kah Seng Tay, I was the ...

  5. cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞

    上篇文章实现了坦克与地图碰撞的检测, 这篇我们继续完成子弹和地图的碰撞检测. 1.先设计一个子弹类Bullet,如下所示: class Bullet : public CCSprite { publi ...

  6. codeforces 316F3 Suns and Rays

    题目在此 找出中有多少个太阳以及每个太阳的散发线段. 算法 原图: 将图"缩小",如果一个白点的四周有黑点,那么把这个白点变成黑点: 将图"放大",即上述&qu ...

  7. Jquery progressbar通过Ajax请求获取后台进度演示

    项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...

  8. 半透明panel

    用API  SetLayeredWindowAttributes

  9. IE浏览器下安装firebug

    第一步: 将一个网址拖动到地址收藏栏: 第二步: 第三步: 将路径改为:javascript: var dd = (window["inIframe"] || window).do ...

  10. JS Call()与Apply()

    JS Call()与Apply() ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是thi ...