紫书 例题7-7 UVA 1354

本文介绍了一种通过枚举二叉树的方式解决天平平衡问题的方法,并提供了详细的AC代码实现。该方法通过维护重量、左臂总长和右臂总长来确保天平在放置多个重物时仍能保持平衡,同时计算出天平的最大延伸长度。

【题意】给出了房间的宽度,天平长度为1,天平有左右两个空位,可以放重物或另一个天平,然后有n个重物放到天平上保持天平平衡的情况下问天平最宽延伸是多少。

【解题方法】 这道题十分的有意思,实在不知道怎么做,看了紫书的思路,仍然写不出代码,主要是不知道如何去枚举二叉树。查看了刘老师的标程,终于弄懂了、也学到了二叉树该如何去枚举。解决了这个问题就可以,每次枚举两个坠合并成一个坠,那么每次都会使得整个可选的坠的数目减一。

把每个坠都看成一个天平,因此有三个量需要维护:w,l,r(重量,左臂总长,右臂总长),同时在合并两个坠的时候要考虑特殊情况,左边的那个坠右臂特别长,或者右边的那个坠左臂特别长  。所以有这么一段:llx=max(a[i].l+l,a[j].l-r);  rrx=max(a[j].r+r,a[i].r-l); 为了便于来理解我画一个图:



【AC代码】


//
//Created by BLUEBUFF 2016/1/6
//Copyright (c) 2016 BLUEBUFF.All Rights Reserved
//

#pragma comment(linker,"/STACK:102400000,102400000")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <time.h>
#include <cstdlib>
#include <cstring>
#include <sstream> //isstringstream
#include <iostream>
#include <algorithm>
using namespace std;
//using namespace __gnu_pbds;
typedef long long LL;
typedef pair<int, LL> pp;
#define REP1(i, a, b) for(int i = a; i < b; i++)
#define REP2(i, a, b) for(int i = a; i <= b; i++)
#define REP3(i, a, b) for(int i = a; i >= b; i--)
#define CLR(a, b)     memset(a, b, sizeof(a))
#define MP(x, y)      make_pair(x,y)
const int maxn = 6;
const int maxm = 2e5;
const int maxs = 10;
const int maxp = 1e3 + 10;
const int INF  = 1e9;
const int UNF  = -1e9;
const int mod  = 1e9 + 7;
int gcd(int x, int y) {return y == 0 ? x : gcd(y, x % y);}
//typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>order_set;
//head

struct node{
    double l, r;
    node(){}
    node(int l, int r) : l(l), r(r) {}
};

int n, vis[1<<maxn];
double rr, w[maxn], sum[1<<maxn];
vector <node> tree[1<<maxn];

void dfs(int s)
{
    if(vis[s]) return; //记忆化
    vis[s] = 1;
    bool leaf = 0;
    for(int l = s & (s - 1); l; l = (l - 1) & s){//枚举二叉树
        leaf = 1;
        int r = s ^ l;
        double d1 = sum[r] / sum[s];
        double d2 = sum[l] / sum[s];
        dfs(l);
        dfs(r);
        for(int i = 0; i < tree[l].size(); i++){
            for(int j = 0; j < tree[r].size(); j++){
                node tx;
                tx.l = max(tree[l][i].l + d1, tree[r][j].l - d2);
                tx.r = max(tree[r][j].r + d2, tree[l][i].r - d1);
                if((tx.l + tx.r) < rr) tree[s].push_back(tx);
            }
        }
    }
    if(!leaf) tree[s].push_back(node(0, 0));
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%lf%d", &rr, &n);
        REP1(i, 0, n) scanf("%lf", &w[i]);
        REP1(i, 0, (1 << n)){
            sum[i] = 0;
            tree[i].clear();
            REP1(j, 0, n){
                if(i & (1<<j)){
                    sum[i] += w[j];
                }
            }
        }
        memset(vis, false, sizeof(vis));
        int u = (1 << n) - 1;
        dfs(u);
        double ans = -1.0;
        REP1(i, 0, tree[u].size()){
            ans = max(ans, tree[u][i].l + tree[u][i].r);
        }
        printf("%.10f\n", ans);
    }
    return 0;
}


【3D应力敏感度分析拓扑优化】【基于p-范数全局应力衡量的3D敏感度分析】基于伴随方法的有限元分析和p-范数应力敏感度分析(Matlab代码实现)内容概要:本文档介绍了基于伴随方法的有限元分析与p-范数全局应力衡量的3D应力敏感度分析,并结合拓扑优化技术,提供了完整的Matlab代码实现方案。该方法通过有限元建模计算结构在载荷作用下的应力分布,采用p-范数对全局应力进行有效聚合,避免传统方法中应力约束过多的问题,进而利用伴随法高效求解设计变量对应力的敏感度,为结构优化提供关键梯度信息。整个流程涵盖了从有限元分析、应力评估到敏感度计算的核心环节,适用于复杂三维结构的轻量化与高强度设计。; 适合人群:具备有限元分析基础、拓扑优化背景及Matlab编程能力的研究生、科研人员与工程技术人员,尤其适合从事结构设计、力学仿真与多学科优化的相关从业者; 使用场景及目标:①用于实现高精度三维结构的应力约束拓扑优化;②帮助理解伴随法在敏感度分析中的应用原理与编程实现;③服务于科研复现、论文写作与工程项目中的结构性能提升需求; 阅读建议:建议读者结合有限元理论与优化算法知识,逐步调试Matlab代码,重点关注伴随方程的构建与p-范数的数值处理技巧,以深入掌握方法本质并实现个性化拓展。
下载前必看:https://pan.quark.cn/s/9f13b242f4b9 Android 平板设备远程操控个人计算机的指南 Android 平板设备远程操控个人计算机的指南详细阐述了如何运用 Splashtop Remote 应用程序达成 Android 平板设备对个人计算机的远程操控。 该指南被划分为四个环节:首先,在个人计算机上获取并部署 Splashtop Remote 应用程序,并设定客户端密码;其次,在 Android 平板设备上获取并部署 Splashtop Remote 应用程序,并与之建立连接至个人计算机的通道;再次,在 Splashtop Remote 应用程序中识别已部署个人计算机端软件的设备;最后,运用平板设备对个人计算机实施远程操控。 关键点1:Splashtop Remote 应用程序的部署与配置* 在个人计算机上获取并部署 Splashtop Remote 应用程序,可通过官方网站或其他获取途径进行下载。 * 部署结束后,必须输入客户端密码,该密码在平板控制计算机时用作验证,密码长度至少为8个字符,且需包含字母与数字。 * 在配置选项中,能够设定是否在设备启动时自动运行客户端,以及进行互联网搜索设置。 关键点2:Splashtop Remote 应用程序的 Android 版本获取与部署* 在 Android 平板设备上获取并部署 Splashtop Remote 应用程序,可通过 Google Play Store 或其他获取途径进行下载。 * 部署结束后,必须输入客户端密码,该密码用于连接至个人计算机端软件。 关键点3:运用 Splashtop Remote 远程操控个人计算机* 在 Splashtop Remote 应用程序中识别...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值