UVa 1354 天平难题 枚举二叉树

题意:给出房间宽度 r 和 s 个挂坠的重量 wi,设计一个尽量宽的天平,挂着所有挂坠。天平由一些长度为 1 的木棍组成,木棍的每一端要么挂一个挂坠,要么挂另外一个木棍。

这题卡了很久,看了很多大神的代码,终于把细节都搞懂了。

将挂坠所有可能的集合的重量算出来,再用二进制的方式枚举子集(左子树)和补集(右子树)构成二叉树,算出左右的宽度。

代码:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;const int MAX = 6;struct Tree{double L, R;    //树的左边和右边的长度Tree():L(0), R(0){}
};double width, w[MAX], sum[1<<MAX];
int vis[1<<MAX];
vector<Tree> tree[1<<MAX];        //枚举出来的结点可以组合成多个树void dfs(int subset);        //枚举二叉树int main(){freopen("input.txt", "r", stdin);int T;cin >> T;while(T--){int s;scanf("%lf%d", &width, &s);for(int i=0; i<s; i++){scanf("%lf", &w[i]);}//初始化 memset(sum, 0, sizeof(sum));for(int i=1; i<(1<<s); i++){tree[i].clear();    //清空树int k = 1;for(int j=0; j<s; j++){    //算出当前集合所有结点的重量和if(k & i){sum[i] += w[j];}k = (k << 1);} }//进行枚举int root = (1<<s) - 1;memset(vis, 0, sizeof(vis));dfs(root);//得到最大的答案double ans = -1;for(int i=0; i<tree[root].size(); i++){ans = max(tree[root][i].L + tree[root][i].R, ans);} printf("%.10lf\n", ans);}} void dfs(int subset){if(vis[subset])return;vis[subset] = 1;bool hasChild = false;for(int left = ((subset-1) & subset); left > 0; left = ((left-1) & subset)){    //枚举集合 hasChild = true;int right = subset ^ left;        //left 的补集double l = sum[right] / sum[subset];    //左臂长度double r = sum[left] / sum[subset];        //右臂长度
        dfs(left);    dfs(right);        //把左右树的子树也枚举出来for(int i=0; i<tree[left].size(); i++){            //将枚举出的左右子树组合起来 for(int j=0; j<tree[right].size(); j++){Tree t;t.L = max(tree[left][i].L + l, tree[right][j].L - r);t.R = max(tree[right][j].R + r, tree[left][i].R - l);if(t.L + t.R < width){                    //如果满足条件,枚举结果加一 
                    tree[subset].push_back(t); }}}}if(!hasChild){        //叶子结点的左右臂为零 
        tree[subset].push_back(Tree());}}

 

转载于:https://www.cnblogs.com/lighter-blog/p/7216349.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过指针便利图像元素

for (size_t y 0; y < image.rows; y) {//row_ptr为第y行的头指针&#xff0c;unsigned char* row_ptr image.ptr<unsigned char>(y);for (size_t x 0; x < image.cols; x) {//data_ptr: 指向待访问像素unsigned char* data_ptr &row_ptr[x*image.channels…

[精华][推荐]SSO CAS单点登录框架学习 搭建详细步骤及源码

1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) &#xff0c;并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个) 2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进行。 2) SS…

电脑下载的M4A格式文件怎么转换为MP3格式

M4A文件格式并不是一个家喻户晓的名字&#xff0c;与&#xff2d;&#xff30;&#xff13;格式相比&#xff0c;知名度远远落后。但是&#xff0c;这并不意味着它无关紧要&#xff0c;有时候我们下载的音乐可能就是M4A格式的&#xff0c;如果换一个设备播放可能就会出现格式不…

python-for循环

一、功能 for 循环提供了python中最强大的循环结构&#xff08;for循环是一种迭代循环机制&#xff0c;而while循环是条件循环&#xff0c;迭代即重复相同的逻辑操作&#xff0c;每次操作都是基于上一次的结果&#xff0c;而进行的&#xff09; Python for循环可以遍历任何序列…

六、利用frp穿透连接内网的linx系统和windows系统

服务端的配置 # frps.ini [common] bind_port 7000 说明&#xff1a;防火墙放行该端口 启动&#xff1a;./frps -c ./frps.ini 后台启动&#xff1a;nohup ./frps -c ./frps.ini & 客户端的配置 (1)windows系统 # frpc.ini [common] server_addr x.x.x.x server_port 70…

根据相机内参进行图像去畸变

cv::Mat img; cv::Mat img_undistort; double fx,fy, cx, cy, k1, k2, p1, p2, k3;for(int v 0; v < img.rows; v){for(int u 0; u < img.cols; u){//根据内参数&#xff0c;计算归一化坐标系下的坐标点double x (u-cx)/fx;double y (v-cy)/fy;double r2 x*x y*y;/…

initialize方法与load方法比较

load方法和initialize方法类似点 1. 都只会调用一次2. 父类在子类之前加载 复制代码不同点在于&#xff1a; 1. 加载时间不同&#xff0c;load方法在main()函数前进行调用&#xff0c;initialize在第一次调用类的所属方法时在调用<可能永远不调用>。2. load方法不会被Cat…

KindEditor

1、进入官网 2、下载 官网下载&#xff1a;http://kindeditor.net/down.php 3、文件夹说明 ├── asp asp示例 ├── asp.net asp.net示例 ├── attached 空文件夹&#xff0c;放置关联文件attached ├── …

service mysqld start,Failed to start mysqld.service: Access denied

service mysqld start 然后报&#xff1a; AUTHENTICATING FOR org.freedesktop.systemd1.manage-units Authentication is required to start mysqld.service.Authenticating as: lll,,, (lll)Password: polkit-agent-helper-1: pam_authenticate failed: Authentication fa…

使用realsense t265测试svo2.0视觉里程计

毕业三年了&#xff0c;现在是第二份工作&#xff0c;第一份工作已经结束一年半了&#xff0c;这意味着&#xff0c;我有一年半的时间没有搞视觉SLAM相关的东西了&#xff0c;虽然在第二份工作也是做视觉相关的&#xff0c;但是只是用到一些目标识别和跟踪的知识&#xff0c;并…

JSP动作标识

jsp中include有两种形式: include指令&#xff1a;<% include file""%> include动作&#xff1a;<jsp:include page"" /> 他们的区别&#xff1a; <% include file""%>又称静态包含&#xff0c;使用时要注意以下几点&#xf…

面试必问之JVM原理

1&#xff1a;什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令…

InfluxDB学习之InfluxDB的基本操作

InfluxDB提供类SQL语法&#xff0c;如果熟悉SQL的话会非常容易上手。本文就为大家介绍一下InfluxDB的基本操作。 InfluxDB提供类SQL语法&#xff0c;如果熟悉SQL的话会非常容易上手。 一、InfluxDB操作方式 InfluxDB提供三种操作方式&#xff1a; 1&#xff09;客户端命令行方式…

运行svo 2.0的 vio时遇到opencv冲突的问题

当我运行如下指令时&#xff0c;遇到了如下问题 指令 cd svo_ws source ./devel/setup.bash roslaunch svo_ros euroc_vio_mono.launch rosbag play MH_01_easy.bag -s 50 运行时遇到的问题 OpenCV Error: Bad argument (Unknown interpolation method) in resize, file /b…

DOS Network一月项目月报

欢迎大家阅读DOS Network第一期项目月报&#xff01;DOS为了跟大家更好的沟通和交流&#xff0c;将在每个月为大家跟进DOS Network项目进展月报。月报主要分为项目研发和社区及营销两个部分。 如果你是刚认识DOS Network预言机网络的新朋友&#xff0c;欢迎查阅往期文章&#x…

lsof详解

from:https://www.cnblogs.com/the-study-of-linux/p/5501593.html lsof (list open files)是一个列出当前系统打开文件的工具。在linux系统环境下&#xff0c;任何事物都可以以文件形式存在&#xff0c;通过文件不仅可以访问常规的数据&#xff0c;还可以访问网络连接和硬件。…

Ubuntu18.04上下载安装使用sogou输入法

下载地址&#xff1a;搜狗输入法Linux官网-首页 安装设置网址&#xff1a;搜狗输入法Linux官网-安装指导 这样Ubuntu下工作就更加方便了。

正则

&#xff08;一&#xff09;字符类 [...]  方括号内的任意字符 [^...]   不在方括号内的任意字符 .    除换行符和其它Unicode行终止符之外的任意字符 \w   任何ASCII字符组成的单词&#xff0c;等价于[a-zA-Z0-9] \W   任何非ASCII字符组成的单词&#xff0c;等价…

使用Cloud Studio写python

1、进入【腾讯云开发者平台】 2、点击【进入工作空间】 3、点击【新建工作空间】 4、点击【从模版创建】 选择你需要的空间环境&#xff0c;就可以开始啦&#xff01;转载于:https://juejin.im/post/5c75f79051882562962ef5d7

显卡、显卡驱动、显存、GPU、CUDA、cuDNN

&#xfeff;&#xfeff;显卡Video card&#xff0c;Graphics card&#xff0c;又叫显示接口卡&#xff0c;是一个硬件概念&#xff08;相似的还有网卡&#xff09;&#xff0c;执行计算机到显示设备的数模信号转换任务&#xff0c;安装在计算机的主板上&#xff0c;将计算机的…