HDU 4921 Map
题意:
给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的更多相关文章
- HDU 4921 Map(状态压缩)
题意看这篇博客. 思路参考的这篇博客. 补充:面对这种问题有一个常见的套路.比如计算若干个区间对答案的贡献这种问题,直接暴力可能复杂度到O(n ^ 2), 而我们可以计算出每个元素在多少个合法区间中, ...
- HDU 4921 Map DFS+状态压缩+乘法计数
算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久, ...
- hdu 1075 (map)
http://acm.hdu.edu.cn/showproblem.php?pid=1075 What Are You Talking About Time Limit: 10000/5000 MS ...
- hdu 1247 map的使用
http://acm.hdu.edu.cn/showproblem.php?pid=1247 Hat’s Words Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 4941 map的使用
http://acm.hdu.edu.cn/showproblem.php?pid=4941 给定N,M和K,表示在一个N*M的棋盘上有K个棋子,给出K个棋子的位置和值,然后是Q次操作,对应的是: 1 ...
- hdu 2112 HDU Today(map与dijkstra的结合使用)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 5167(map + 暴力)
题意:给出一个数n,问n能否是斐波那契数列中数的乘积 先刷选 斐波那契数列,然后就枚举 #include <cstdio> #include <cstring> #includ ...
- HDU 1004 MAP【STL__map_的应用】
强大的MAP,今天终于开始好好学习一次. map内部是用红黑树维持的有序结构. 定义:map<int,string>mapStudent; 查找的时间复杂度为对数级别. 1.构造方法学习两 ...
- HDU 4329 MAP(stringstream的用法)
这个题目有点绕,但是按着他的意思写不难模拟出来.本来是一场学弟们的训练赛,我这个学长在赛场上却WA了四次都没过,三条黑线就一直在我的脑袋上挂着... 赛后开始找原因,后来发现题目看错了,1/R中的R是 ...
随机推荐
- perl 面向对象 new方法
[root@wx03 test]# cat Scan.pm package Scan; sub new{ my $class = shift; my $self={ 'a'=>11, 'b'=& ...
- HDU 3790 最短路径问题 (SPFA)
转载请注明出处:http://blog.csdn.net/a1dark 分析:比一般最短路多了一个花费.多加一个判断即可.用的SPFA.这道题让我搞清楚了以前定义INF为啥爆的问题.受益颇多. #in ...
- HTML的表单元�
HTML的表单元素 表单元素是同意用户在表单中(比方:文本域,下拉列表,单选框,复选框等等)输入信息的元素 表单标签 文本域(Text Fields) 当用户要在表单中键入字母,数字等内容时,就会用到 ...
- Winsock基础编程
Winsock基础编程 Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用 ...
- fzu 1911 Construct a Matrix(矩阵快速幂+规律)
题目链接:fzu 1911 Construct a Matrix 题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和.r = s[n] % m.构造一个r * r的矩阵,只 ...
- 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序
原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim ...
- 基于visual Studio2013解决面试题之0807strstr函数
题目
- Android中获取电池电量
/** * * @author chrp * *显示当前电池电量 */ public class MainActivity extends Activity { private TextView tv ...
- ASP.NET、WinForm - 判断整个页面文本框是否为空
foreach(Control ctrl in Page.Controls) { foreach(Control childc in ctrl.Controls) { switch(childc.Ge ...
- 终于懂了:WM_PAINT 与 WM_ERASEBKGND(三种情况:用户操作,UpdateWindow,InvalidateRect产生的效果并不相同),并且用Delphi代码验证 good
一直对这两个消息的关系不是太了解,借重新深刻学习windows编程的机会研究一番. 1)当窗口从无效变为有效时,比方将部分覆盖的窗口恢复时会重绘窗口时:程序首先会通过发送其他消息调用DefWindow ...