uva1354 天平难题 解题报告

uva1354 天平难题。主要有 回溯法,二叉树模拟。

当然,这道题也有很多剪枝,但是这个用二叉树性质模拟的数组应该过了,这样写,这道题,完全就足够了。

原题目链接:https://uva.onlinejudge.org/external/13/1354.pdf

题目大意:

就是首先给你一个房间的宽度r,之后有s个挂坠,第i个挂坠的重量是wi,设计一个尽量宽,但是不能宽过房间.的天平。当然会有好几组这样的数据。

这些天平棍的长度都为1,天平棍要么挂 挂坠,要么就继续挂木棍设挂的木棍必须要让天平平衡,满足n*a==m*b。这就是个物理概念。

其它东西,题目里写的很清楚。

而这道题整体思想就是 1,枚举二叉树。2,计算宽度。

枚举二叉树,很显然用到的是dfs+回溯。

二叉树的模型,主要就用的是这个东西来枚举 like根==i子节点== i*2,i*2+1,这样的。

从第二个点开始枚举。其中dfs(num,sit,use)

num:代表这个节点编号,

sit:现在这棵树中有多少位置可供填写。

use:现在有use个挂件还可以用。

PS:枚举的时候还要注意,每次进到一个新点的时候要判断父亲节点是不是天平棍,-1为棍,如果不是棍,就++,找下一个节点。

计算宽度的时候,从最后一个点开始往前递推。设以这个节点为0,左边就是负长度,而右边就是正长度。这就很好的解释了其中

l[i]=min(-L+l[x],R+l[y]);

r[i]=max(-L+r[x],R+r[y]);

这段代码的意思。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 double val[10],l[105],r[105],w[10],ans,room;
 6 int n,t[105],visit[105];
 7 int judge(int x)
 8 {
 9     memset(l,0,sizeof(l));
10     memset(r,0,sizeof(r));
11     memset(val,0,sizeof(val));
12     for(int i=x;i;i--)
13     {
14         if(t[i]==-1){ //是天平棍,对它的子节点进行处理。
15             int x=i*2,y=i*2+1;
16             val[i]=val[y]+val[x];
17             double L=val[y]/val[i];
18             double R=val[x]/val[i];
19             l[i]=min(-L+l[x],R+l[y]);
20             r[i]=max(-L+r[x],R+r[y]);
21         }
22         else if (t[i])//或者是挂件。只计量挂件的重量就行了。
23         {
24             val[i]=w[t[i]];
25         }
26     }
27     double a=r[1]-l[1];
28     if(a-room<1e-5)ans=max(ans,a);
29 }
30 int DFS(int num,int sit,int use)
31 {
32     if(use==0){//所有的挂件都放完了,开始计算长度。
33         judge(num-1);
34         return 0;
35     }
36     if(t[num/2]!=-1){//父亲节点不是棍子,就不能往下放东西。
37         DFS(num+1,sit,use);
38     }
39     else
40     {
41         if(use>sit){//挂件要比位置多,创位置。
42             t[num]=-1;
43             DFS(num+1,sit+1,use);
44             t[num]=0;
45         }
46         if(sit==1&&use>1) return 0;
47         for(int i=1;i<=n;i++)
48         {
49             if(!visit[i]){
50                 visit[i]=1;
51                 t[num]=i;
52                 DFS(num+1,sit-1,use-1);//放挂件
53                 visit[i]=0;
54                 t[num]=0;
55             }
56         }
57     }
58 }
59 int main()
60 {
61     int tot;
62     scanf("%d",&tot);
63     while(tot--)
64     {
65         scanf("%lf%d",&room,&n);
66         memset(w,0,sizeof(w));
67         memset(t,0,sizeof(t));
68         memset(visit,0,sizeof(visit));
69         for(int i=1;i<=n;i++)
70         scanf("%lf",&w[i]);
71         ans=-1;
72         t[1]=-1;  //第一个根就是个棍。
73         if(n==1){
74             printf("%.10lf\n",0.0);
75         }
76         else {
77             DFS(2,2,n);//从节点2开始枚举。刚好就只有2个位置。
78             if(ans==-1)printf("-1\n");
79             else printf("%.10lf\n",ans);
80         }
81     }
82     return 0;
83 }
时间: 2024-10-15 07:54:04

uva1354 天平难题 解题报告的相关文章

洛谷OJ P1379 八数码难题 解题报告

洛谷OJ P1379 八数码难题 解题报告 by MedalPluS 题目描述   在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变.   输入格式   输入初试状态,一行九个数字,空格用0表示   输出格式 只有一行,该行只有一个数字,表示从初始状态到

ACM:统计难题 解题报告-字典树(Trie树)

统计难题 Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Status Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignati

[BZOJ3698]XWW的难题解题报告|上下界网络流|有源汇最大流

XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A,满足XWW性.称一个N*N的矩阵满足XWW性当且仅当:(1)A[N][N]=0:(2)矩阵中每行的最后一个元素等于该行前N-1个数的和:(3)矩阵中每列的最后一个元素等于该列前N-1个数的和.现在你要给A中的数进行取整操作(可以是上取整或者下取整),使得最后的A矩阵仍然满足XWW性.同时XWW还要求A中的元

UVa1354 ——天平难题

考察回溯法的题目. 难点在于如何枚举天平结构的各种情况. 思路1:自底向上,用类似二叉树的结构储存(类似霍夫曼树,挂坠全部在叶节点),每次选择两个节点组成一个子树同时算出子树的左右臂长度,递归建树.但是这样会有较多重复的情况. 思路2:自顶向下,把集合分为左右子集(分别为左右子树所含的挂坠集合),在递归调用左右子集.枚举子集的思路用的是二进制枚举集合的思路,每个二进制数分别对应挂坠集合能组成的所有天平的左右臂长度,用vector<Node> node[MAXN]储存,[]内是二进制数.还用到了

USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

holstein解题报告 ------------------------------------------------------------------------------------------------------------------------------------------------[题目] 你需要给一头奶牛制定最优的喂养计划. 有V种维他命,每天对于每种维他命,牛都有需要达到的指标: 同时你有G种饲料,编号依次为1到G,每种维他命在每种饲料中所蕴含的量都会给你.

leetCode解题报告5道题(七)

先送上亚马逊传送门:<黑客与画家>:硅谷创业之父 Paul Graham 文集 再送上一个思维导图: 最好的办法就是自己创业或者加入创业公司 一个命题 命题 创业是一个压缩的过程,所有工作压缩成短短几年. 你不再是低强度的工作四十年,而是以极限强度工作四年 举例解释 一个优秀的黑客去除各种障碍,工作效率可以是在公司时的36倍. 假设他年薪8万美元,那么一个勤奋工作,摆脱杂事干扰的聪明黑客, 他的工作相当于年薪200万美元的价值 这里说的是极限情况,休闲时间为0,工作强度足以危害到健康. 守恒定

NOIP2009解题报告

09年的题总体来说 没有难题,但是每道题除了第一题都要认真的慢慢写才能AC, 第一题: R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:1. S国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的内容均由大写字母‘A’—‘Z’构成(无空格等其他字母).2. S国对于每个字母规定了对应的“密字”.加密的过程就是将原信息中的所有字母替换为其对应的“密字”.3. 每个字母只对应一个唯一的“密字

NOIP2005 篝火晚会 解题报告

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照1,2,……,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学.如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题. 佳佳可向同学们下达命令,每一个命令的形式如下: (b1, b2,... bm -1, bm) 这里m的值是由佳佳决定的,每次命令m的值都可以不同

人生第一场CTF的解题报告(部分)

解题报告 濮元杰部分: 王者归来: 120 场景 小王入职了一段时间,最近有点无聊.Web安全项目不多,白天看着其他项目组的同事忙得热火朝天,小王有点坐不住了,这也许是新人都会有的想法,乐于助人.想到这,小王一眼看到了隔壁的小丽,哎,IT界小丽绝对算得上是一位美女啦,于是小王凑了过去对小丽说:小丽,看你眉头紧锁的,需要本大侠帮忙吗?小丽转头看着小王,愣了足足有10秒,突然说:那,那好吧,如果你帮我搞定这三个问题,嗯~我请你吃晚饭,就我们两个.天哪,这,这,小王已经按耐不住突如其来的喜悦,战斗力倍