HDU 4921 Map

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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118188.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux文件夹权限777怎么设置,Linux:设置文件夹权限之777的含义[通俗易懂]

    linux文件夹权限777怎么设置,Linux:设置文件夹权限之777的含义[通俗易懂]今天面试的时候一不小心就给自己挖坑了,说使用过的Linux命令时,我说了一个mkdir-m777文件夹名称——创建文件夹及授予权限,然后就被问:为什么mkdir-m777文件夹名称授予文件夹权限要用777?在linux系统中,文件或目录的权限可以分为3种:R:4可读W:2可写X:1执行-:对应数值0数字4、2和1表示读、写、执行权限rwx=4+2+1…

    2022年10月21日
    3
  • leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)

    leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)题目 https leetcode cn com problems nim game 题解本题实际上是一个需要分析的数学题 如果第一时间没有发现规律的话 可以尝试先用递归法 暴力输出前几个 观察规律 用本函数跑 1 100 找规律 publicboolea intn if n lt 3 returntrue canWinNim n 1 canWinNim n 2 canWinNim n 3 只要有一个为 false 本轮就

    2025年8月13日
    1
  • 企业级大数据平台建设参考(续集)[通俗易懂]

    企业级大数据平台建设参考(续集)[通俗易懂]很早之前我写过一篇《企业级大数据平台建设参考|淘宝&滴滴&美团&360&快手&京东》。本文是李智慧老师《大数据技术架构:核心原理与应用实践》书中…

    2022年5月10日
    40
  • Android开发环境配置(以windows为例)

    Android开发环境配置(以windows为例)Android开发环境配置工具   如果你准备从事Android开发,那么无论选择在eclipse下开发,还是选择在AndroidStudio下开发,都可以参照以下步骤进行Android开发环境的配置。Android开发环境配置过程1.准备笔记本或台式机  使用笔记本还是台式机,视个人需求而定,但我要强调的是在配置上不要手软,要舍得下手。一台流畅的电脑,会让

    2022年7月23日
    9
  • 怎样从数组中删除给定元素_java数组包含某个元素

    怎样从数组中删除给定元素_java数组包含某个元素packageday21;importjava.util.Scanner;//调用Scanner一个简单的文本扫描器importstaticnet.mindview.util.Print.*;importjava.util.Random;publicclassShow{publicstaticvoidmain(String[]args){int[]a={0,1,2,3};for(inti:a).

    2022年8月10日
    10
  • WebAssembly完全入门——了解wasm的前世今身

    WebAssembly完全入门——了解wasm的前世今身前言接触WebAssembly之后,在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成

    2022年8月1日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号