UVA437 巴比伦塔 The Tower of Babylon

news/2024/10/22 20:28:31/

UVA437 巴比伦塔 The Tower of Babylon

题面翻译

题目描述

你可能已经听说过巴比伦塔的传说。现在这个传说的许多细节已经被遗忘。所以本着本场比赛的教育性质,我们现在会告诉你整个传说:

巴比伦人有 n n n 种长方形方块,每种有无限个,第 i i i 种方块的三边边长是 x i , y i , z i xi,yi,zi xi,yi,zi。对于每一个方块,你可以任意选择一面作为底,这样高就随着确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。

他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。这意味着,一个方块甚至不能堆在一个底的尺寸与它一样的方块的上面。

你的任务是编写一个程序,计算出这个塔可以建出的最高的高度。

输入格式

输入会包含至少一组数据,每组数据的第一行是一个整数 n ( n ≤ 30 ) n(n\le30) n(n30),表示方块的种类数。 这组数据接下来的 n n n 行,每行有三个整数,表示 x i , y i , z i xi,yi,zi xi,yi,zi。输入数据会以 0 0 0 结束。

输出格式

对于每组数据,输出一行,其中包含组号(从 1 1 1 开始)和塔最高的高度。按以下格式:Case i: maximum height = __

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0

样例输出 #1

Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342

Solution

因为方块数目不限,每一个方块有长宽高三个参数,方块放置有6种方式分别为:

  1. x,y,z
  2. y,x,z
  3. y,z,x
  4. z,y,x
  5. z,x,y
  6. x,z,y

设dp[i]表示第i个方块可以放置的最大高度,则可以建立状态转移方程,在满足一个方块的底的两条边严格小于另一个方块的底的两条边的情况下,有状态转移方程dp[i] = max(dp[j] + blocks[i].getHigh(), dp[i]);

其中对blocks进行排序是因为只有保证上层的块的底面积严格小于下层的块的时候,才可以将上层的块放到下层的块上

//
// Created by Gowi on 2023/11/24.
//#include <iostream>
#include <cstring>
#include <algorithm>#define N 200using namespace std;class block {
private:int x, y, z, area, high;
public:block() {};block(int a, int b, int c) {x = a;y = b;z = c;area = a * b;high = c;}bool operator<(block a) const {return this->area <= a.area;}int getX() const {return x;}void setX(int x) {block::x = x;}int getY() const {return y;}void setY(int y) {block::y = y;}int getZ() const {return z;}void setZ(int z) {block::z = z;}int getArea() const {return area;}void setArea(int area) {block::area = area;}int getHigh() const {return high;}void setHigh(int high) {block::high = high;}
};int n, t;
block blocks[N];
int dp[N];bool init() {t = 0;cin >> n;if (n == 0) {return false;}memset(blocks, 0, sizeof(blocks));memset(dp, 0, sizeof(dp));for (int i = 0; i < n; ++i) {int a, b, c;cin >> a >> b >> c;blocks[t++] = block(a, b, c);blocks[t++] = block(b, a, c);blocks[t++] = block(b, c, a);blocks[t++] = block(c, b, a);blocks[t++] = block(c, a, b);blocks[t++] = block(a, c, b);}sort(blocks, blocks + t);return true;
}int main() {int k = 0;while (init()) {int maxheight = 0;for (int i = t - 1; i >= 0; i--) {dp[i] = blocks[i].getHigh();for (int j = t - 1; j >= 0; j--) {if (blocks[i].getX() < blocks[j].getX() && blocks[i].getY() < blocks[j].getY()) {dp[i] = max(dp[j] + blocks[i].getHigh(), dp[i]);}}if (dp[i] > maxheight) {maxheight = dp[i];}}cout << "Case " << ++k << ": maximum height = " << maxheight << endl;}return 0;
}

http://www.ppmy.cn/news/1239382.html

相关文章

C#中反射的使用总结

反射是.NET中的重要机制&#xff0c;通过反射&#xff0c;可以在运行时获得程序或程序集中每一个类型&#xff08;包括类、结构、委托、接口和枚举等&#xff09;的成员和成员的信息。可以直接通过反射方式创建对象&#xff0c;即使这个对象的类型在编译时没有加载。本文主要介…

linux如何获取CPU使用率

Linux 中 一切皆为文件 的设计理念带来了许多好处: 统一接口: 使用相同的 API 可以对所有类型的文件进行操作&#xff0c;例如读取、写入、移动、删除、修改权限等 简化管理: 使用相同的工具和方式来管理文件和设备的操作&#xff0c;例如备份、复制、移动、删除、链接等 编程…

电源控制系统架构(PCSA)之电源管理基础设施组件

目录 6.5 电源管理基础设施组件 6.5.1 电源策略单元 6.5.2 时钟控制器 6.5.3 低功耗Distributor 6.5.4 低功耗Combiner 6.5.5 P-Channel到Q-Channel转换器 6.5 电源管理基础设施组件 6.5.1 电源策略单元 本节介绍电源策略单元(Power Policy Unit, PPU)。PPU的完整细节见…

CF -- Educational Codeforces Round 158 (Rated for Div. 2) -- D 补题记录

Yet Another Monster Fight Problem - D - Codeforces 题目大意&#xff1a; 现在给你一堆怪物&#xff0c;你拥有法术&#xff08;一个法术可以连续攻击这n个所有怪物&#xff09;&#xff0c;你可以选择任意一个怪物作为法术的第一个攻击目标&#xff08;伤害为x&#xff…

虹科Pico汽车示波器 | 汽车免拆检修 | 2017款东风本田XR-V车转向助力左右不一致

一、故障现象 一辆2017款东风本田XR-V车&#xff0c;搭载R18ZA发动机&#xff0c;累计行驶里程约为4万km。车主反映&#xff0c;车辆行驶或静止时&#xff0c;向右侧转向比向左侧转向沉重。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上无故障灯点亮&…

探索网络模型与协议:从OSI到HTTPs的原理解析

一、OSI网络模型 OSI&#xff08;Open Systems Interconnection&#xff09;七层网络参考模型和TCP/IP四层模型都是用于理解和设计计算机网络的框架&#xff0c;但它们之间存在一些差异。 1、七层 vs 四层 OSI七层网络参考模型&#xff1a; 物理层&#xff08;Physical Laye…

Ubuntu中安装搜狗输入法教程(详细图文教程)

习惯了使用搜狗输入法&#xff0c;这里总结了Ubuntu系统下安装搜狗输入法的详细教程&#xff0c;每个步骤都很详细&#xff0c;耐心安装。 搜狗输入法是一款功能强大、使用方便的输入法&#xff0c;能够有效提升用户在Ubuntu系统中的输入体验。 目录 一、下载搜狗安装包1.1 搜…

Redis大key与热Key

什么是 bigkey&#xff1f; 简单来说&#xff0c;如果一个 key 对应的 value 所占用的内存比较大&#xff0c;那这个 key 就可以看作是 bigkey。具体多大才算大呢&#xff1f;有一个不是特别精确的参考标准&#xff1a; bigkey 是怎么产生的&#xff1f;有什么危害&#xff1f;…