UVa1354,ACM/ICPC Tokyo 2005,Mobile Computing(天平难题)

2023-10-28 06:04

本文主要是介绍UVa1354,ACM/ICPC Tokyo 2005,Mobile Computing(天平难题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、题意

给出房间的宽度 r r r s s s 个挂坠的重量 w i w_i wi。设计一个尽量宽(但宽度不能超过房间宽度 r r r)的天平,挂着所有挂坠。

天平由一些长度为1的木棍组成。木棍的每一端要么挂一个挂坠,要么挂另外一个木棍。如图7-9所示,设 n n n m m m 分别是两端挂的总重量,要让天平平衡,必须满足 n ∗ a = m ∗ b n*a=m*b na=mb
在这里插入图片描述
例如,如果有3个重量分别为1, 1, 2的挂坠,有3种平衡的天平,如图7-10所示。
在这里插入图片描述
挂坠的宽度忽略不计,且不同的子天平可以相互重叠。如图7-11所示,宽度为 ( 1 / 3 ) + 1 + ( 1 / 4 ) (1/3)+1+(1/4) (1/3)+1+(1/4)

输入第一行为数据组数。每组数据前两行为房间宽度 r r r 和挂坠数目 s s s 0 < r < 10 0<r<10 0<r<10 1 ≤ s ≤ 6 1≤s≤6 1s6)。以下 s s s 行每行为一个挂坠的重量 w i ( 1 ≤ w i ≤ 1000 ) w_i(1≤w_i≤1000) wi1wi1000。输入保证不存在天平的宽度恰好在 r − 1 0 − 5 r-10 ^{-5} r105 r + 1 0 − 5 r+10^{-5} r+105 之间(这样可以保证不会出现精度问题)。

对于每组数据,输出最优天平的宽度。如果无解,输出-1。你的输出和标准答案的绝对误差不应超过10-8

3、分析

如果把挂坠和木棍都作为结点,则一个天平对应一棵二叉树,如题目中给出的,挂坠为1, 1, 2的3个天平如图7-12所示。
在这里插入图片描述

对于一棵确定二叉树,可以计算出每个挂坠的确切位置,进而计算出整个天平的宽度,所以本题的核心任务是:枚举二叉树

如何枚举二叉树呢?最直观的方法是沿用回溯法框架,每次选择两个结点组成一棵子树,递归 s − 1 s-1 s1层即可。以4个挂坠1, 1, 2, 3为例,下面是解答树的一部分(每个结点的子树并没有全部画出),如图7-13所示。
在这里插入图片描述
上面的方法已经足够解决本题,但还有优化的余地,因为有些二叉树被枚举了多次(如图7-13中的两个粗框结点)。

推荐的枚举方法是:自顶向下构造,每次枚举左子树用到哪个子集,则右子树就是使用剩下的子集。

4、代码实现

// UVa1354 Mobile Computing
// Rujia Liu
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;struct Tree {double L, R; // distance from the root to the leftmost/rightmost pointTree():L(0),R(0) {}
};const int maxn = 6;int n, vis[1<<maxn];
double r, w[maxn], sum[1<<maxn];
vector<Tree> tree[1<<maxn];void dfs(int subset) {if(vis[subset]) return;vis[subset] = true;bool have_children = false;for(int left = (subset-1)&subset; left; left = (left-1)&subset) {have_children = true;int right = subset^left;double d1 = sum[right] / sum[subset];double d2 = 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 + d1, tree[right][j].L - d2);t.R = max(tree[right][j].R + d2, tree[left][i].R - d1);if(t.L + t.R < r) tree[subset].push_back(t);}}if(!have_children) tree[subset].push_back(Tree());
}int main() {int T;scanf("%d", &T);while(T--) {scanf("%lf%d", &r, &n);for(int i = 0; i < n; i++) scanf("%lf", &w[i]);for(int i = 0; i < (1<<n); i++) {sum[i] = 0;tree[i].clear();for(int j = 0; j < n; j++)if(i & (1<<j)) sum[i] += w[j];}int root = (1<<n)-1;memset(vis, 0, sizeof(vis));dfs(root);double ans = -1;for(int i = 0; i < tree[root].size(); i++)ans = max(ans, tree[root][i].L + tree[root][i].R);printf("%.10lf\n", ans);}return 0;
}

这篇关于UVa1354,ACM/ICPC Tokyo 2005,Mobile Computing(天平难题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291200

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

接口自动化三大经典难题

目录 一、接口项目不生成token怎么解决关联问题 1. Session机制 2. 基于IP或设备ID的绑定 3. 使用OAuth或第三方认证 4. 利用隐式传递的参数 5. 基于时间戳的签名验证 二、接口测试中网络问题导致无法通过怎么办 1. 重试机制 2. 设置超时时间 3. 使用模拟数据 4. 网络问题的预检测 5. 日志记录与错误分析 6. 切换网络环境 7.

Mastering Python Scientific Computing

线性方程组 迭代法: 雅可比迭代法 高斯赛德迭代法 非迭代法: 高斯LU矩阵分解法 高斯消元法 非线性方程组: 一维非线性方程解法: 二分法 牛顿法 割线法 插值法 逆差值法 逆二次插值法 线性分式插值法 非线性方程组解法: 牛顿法 割线法 阻尼牛顿法 Broyden法 最优化方法 应用场景 工程力学 经济学 运筹学 控制工程 石油工程 分子

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就

NYOJ 745 蚂蚁的难题(二)

OJ题目 : http://acm.nyist.net/JudgeOnline/problem.php?pid=745 描述 下雨了,下雨了,蚂蚁搬家了。 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈。小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材。因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材。时间紧急,你快帮

ant mobile design组件库的PickerView组件不能滑动

问题 PickerView组件在开发环境可滑动,在测试环境不可滑动 正常开发环境是这样正常显示,并且可滑动的 发到测试环境后,变成了这样,并且只有中间那列可滑动,两边的都不能滑动,而且还会报警告 封装的组件代码如下 // 日期选择组件const CustomDatePickerView: FC<any> = ({customizeTab,setCustomizeTime,cus