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是 ...
随机推荐
- haproxy path_beg
path_beg : prefix match 前缀匹配 path_dir : subdir match path_dom : domain match path_end : suffix match ...
- RESTFul Shiro
RESTFul与服务没有关系?REST的本质是设计风格,不是技术. REST的URL还是个URL,就是个普通的URL,访问这个URL的时候,先被Servlet Filter(即Shiro 的Filte ...
- 基于visual Studio2013解决面试题之1309求子集
题目
- jsp 分页(数据库读取数据)
<%@ page contentType="text/html; charset=gb2312"%> <%@ page language="java&q ...
- 操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率
暴力直接上代码,主要是用了vector来实现,有些方法比較费时,不太好,请各位大神斧正.这是个人的作业, 这是代码下载页http://download.csdn.net/detail/l631068 ...
- 微软vs2015先行,Visual Studio 2015正式版离线iso及在线下载(附key)附带百度云盘地址
win10正式版发布之前我们迎来了vs2015正式版,迫不及待要下载朋友可以看看 Visual Studio Community 2015简体中文版(社区版,针对个人免费): 在线安装exe:http ...
- java.exe路径问题
因为要更换JDK版本,自然也就要重新设置JAVA_HOME环境变量,但设置完成后奇怪的发现,运行java -version时还是原来的版本,莫名其妙,最后我把JAVA_HOME环境变量删除竟然java ...
- 基于visual Studio2013解决C语言竞赛题之1062高与矮
题目 解决代码及点评 /************************************************************************/ /* 62 ...
- mfc修改应用程序外观
1.在窗口创建前修改窗体外观 在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中修改,其中CREATESTRUCT结构中有诸如窗口大小 ...
- 九度OnlineJudge之1018:统计同成绩学生人数
题目描述: 读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入: 测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的 ...