HDU 4921 Map(状态压缩)
题意看这篇博客。
思路参考的这篇博客。
补充:面对这种问题有一个常见的套路。比如计算若干个区间对答案的贡献这种问题,直接暴力可能复杂度到O(n ^ 2), 而我们可以计算出每个元素在多少个合法区间中,然后计算贡献,这样可以降到O(n)。对于此题,计算第一类贡献时就是这种方法。计算有多少种情况包含了这个元素,这样就算出了这种元素对第一种答案的贡献。有一个坑点需要注意,在读入每条边x, y时,必选立刻标记y已经访问过,这样最后没被标记过的就是链头。如果不提前标记,从前往后扫描时第一次遇到的没标记的点不一定是链头。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int tot;
int Next[maxn], now[15], len[15];
bool v[maxn];
int val[maxn];
int main() {
int T, x, y, n, m;
scanf("%d", &T);
double res, ans, sum, method;
bool flag;
int num;
while(T--) {
scanf("%d%d", &n, &m);
memset(v, 0, sizeof(v));
memset(Next, 0, sizeof(Next));
memset(len, 0, sizeof(len));
memset(now, 0, sizeof(now));
tot = 0;
res = 1;
ans = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &val[i]);
}
for (int i = 1; i <= m; i++) {
scanf("%d%d", &x, &y);
x++, y++;
Next[x] = y;
v[y] = 1;
}
for (int i = 1; i <= n; i++) {
if(v[i]) continue;
now[tot] = i;
for (int j = i; j; j = Next[j]) {
len[tot]++;
}
res *= len[tot] + 1;
tot++;
}
for (int dep = 1;; dep++) {
int cnt = 0;
for (int i = 0; i < tot; i++) {
if(now[i])
cnt++;
}
if(cnt == 0) break;
for (int i = 1; i < (1 << tot); i++) {
num = 0;
sum = 0, method = 1;
flag = 0;
for (int j = 0; j < tot; j++) {
if((i >> j) & 1) {
if(!now[j]) {
flag = 1;
break;
}
num++;
sum += val[now[j]];
method *= (len[j] - dep + 1);
} else {
method *= min(dep, len[j] + 1);
}
}
if(!flag) {
ans += method * sum;
if(num > 1)
ans += method * sum * num / cnt;
}
}
for (int i = 0; i < tot; i++)
now[i] = Next[now[i]];
}
printf("%.3f\n", ans / (res - 1));
}
}
HDU 4921 Map(状态压缩)的更多相关文章
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- hdu 5724 SG+状态压缩
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 4921 Map DFS+状态压缩+乘法计数
算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久, ...
- hdu 4272 LianLianKan 状态压缩
LianLianKan Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 1429(bfs+状态压缩)
题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败.因为这里我贡献了一次wa. 分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口, ...
- hdu 2489 最小生成树状态压缩枚举
思路: 直接状态压缩暴力枚举 #include<iostream> #include<algorithm> #include<cstdio> #include< ...
- hdu 4856 Tunnels 状态压缩dp
Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU 5724 Chess (状态压缩sg函数博弈) 2016杭电多校联合第一场
题目:传送门. 题意:有n行,每行最多20个棋子,对于一个棋子来说,如果他右面没有棋子,可以移动到他右面:如果有棋子,就跳过这些棋子移动到后面的空格,不能移动的人输. 题解:状态压缩博弈,对于一行2^ ...
- LianLianKan - HDU 4272(状态压缩)
题目大意:有一列数据,可以从最上面的开始连接下面相同的元素,然后消除,不过距离不能超过6,询问最后能不能消除完整个数列. 分析:首先讨论一点最远能消除的地方,比如点的位置是x,如若想要消除x+1位置处 ...
- HDU 4921 Map
题意: 给n个节点 他们形成了最多10条链 每条最多1000的长度 每一个节点有个val 你能够选择任何位置截断链 断点前的全部节点被你获得 通过题中计算公式得出你的val 问 通过随 ...
随机推荐
- python中的单引号双引号和三引号
python的单引号和双引号没有本质的区别,而三引号有两种作用:注释和换行 一. 单引号中可以包含双引号,双引号中可以包含单引号 print("好好学习,'天天向上'") 结果: ...
- git 远程库 创建私钥
1.创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell(W ...
- Win 7升级记
微软要抛弃它的XP了,我也应该提前把家里的PC升级成Win7,省得将来麻烦事多. 其实升级它也很简单,这全要归功于网络上的能人.我首先在网络上下载好一个操作系统DEEP_Ghost_Win7_Sp1_ ...
- Qt之事件处理机制
思维导读 一.事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下 ...
- [转]【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解
小编:对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”,导致访问错误内容,失败连接等,让我们在互联网上畅游的爽快瞬间消失,而对于这关键的第一跳,鹅厂也在持续深入研究和思考对策,今天小编就邀请 ...
- C#中获取Excel文件的第一个表名
// 2.以数据库方式打开并输入数据// 此方式将xls文件所在目录看作数据库,其中的xls文件看作数据库表,表名即文件名(不加扩展名).// 函数importExcelTo ...
- 反射ORM 三层(for sql server/mysql)
sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 RPROM.cs //(写错愕,应该是RPORM) RPROM.Insert(p1); //需求:DBS中 ...
- 蓝桥杯 算法训练 ALGO-121 猴子分苹果
算法训练 猴子分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果 ...
- java代码----方法类练习中~~~未领会
总结:今天我很失败,问了老师继承的问题还是没弄懂.因为,技术宅的能力,我好怕啊.太强了. package com.da.ima2; public class yut {// 使用substring方法 ...
- Mybatis 一对一(OneToOne)关系映射__INSERT
今天测试Ibatis的一对一的关联映射时总是出现错误,其中很多的错误都是自己不小心写错的..现把整个Ibatis源代码记录下来,以便以后熟记: 1.数据库脚本: CREATE TABLE t_pers ...