C - 猿とバナナ
1069 - HDU
トピックへのリンク:https://vjudge.net/contest/68966#problem/C
トピック:
研究者のグループがサルのIQをテストするための実験を設計しています。彼らは、建物の屋根にバナナをハングアップし、平均時間で、いくつかのブロックに猿を提供します。サルは十分に賢い場合は、タワーを構築し、その好きな食べ物を得るために登るために上に別のものを一つのブロックを配置することにより、バナナに到達することができなければなりません。
研究者は、n個のブロックの種類、および各タイプのブロックの無制限供給を持っています。各I型ブロックは、長さ寸法(xi、yi、zi)を有する矩形固体でした。その三次元のうちのいずれか2つは、ベースの寸法を決定し、他の寸法は高さとなるようにブロックを再配向することができます。
彼らは、ブロックを積み重ねることによって可能に一番高い塔は屋根に達することができることを確認します。問題は、タワーを構築する際に、一つのブロックのみ限りがなければならないので、上部ブロックの2つの基部寸法は両方下部ブロックの対応する基地寸法より厳密に小さかったように、他のブロックの上に配置することができる、ということです上のステップに猿のためのいくつかのスペース。これは、同じサイズの拠点を持っているように配向ブロックを積み重ねることができなかったことを、例えば、意味しました。
あなたの仕事は猿がブロックの特定のセットを構築することができます一番高い塔の高さを決定するプログラムを書くことです。
研究者は、n個のブロックの種類、および各タイプのブロックの無制限供給を持っています。各I型ブロックは、長さ寸法(xi、yi、zi)を有する矩形固体でした。その三次元のうちのいずれか2つは、ベースの寸法を決定し、他の寸法は高さとなるようにブロックを再配向することができます。
彼らは、ブロックを積み重ねることによって可能に一番高い塔は屋根に達することができることを確認します。問題は、タワーを構築する際に、一つのブロックのみ限りがなければならないので、上部ブロックの2つの基部寸法は両方下部ブロックの対応する基地寸法より厳密に小さかったように、他のブロックの上に配置することができる、ということです上のステップに猿のためのいくつかのスペース。これは、同じサイズの拠点を持っているように配向ブロックを積み重ねることができなかったことを、例えば、意味しました。
あなたの仕事は猿がブロックの特定のセットを構築することができます一番高い塔の高さを決定するプログラムを書くことです。
InputThe入力ファイルは、1つまたは複数のテストケースが含まれています。各テストケースの最初の行は、整数nが含まれている
次のデータセット内の異なるブロックの数を表します。nの最大値は30であり、
次のn行の各々が値XI、YIとZIを表す3つの整数を含みます。
入力は、nはゼロ(0)の値によって終了されます。
OutputFor各テストケース、ケース番号(それらは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 6 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0サンプル出力
1ケース:最大高さ= 40 ケース2:最大高さ= 21 ケース3:最大高さ= 28 ケース4:最大高さ= 342
質問の意味:あなたの長さと、n個の矩形の幅、下要件より長方形を与えます小さな長方形の長さと幅を重ね合わせることができる方法を高依頼する必要があります
アイデアを:コードを参照してください
// // 2019年8月4日に羽生によって作成されます。 // する#include <アルゴリズム> 書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include < 設定 > 書式#include <math.h>の 書式#include <マップ> 使用して 名前空間はstd; typedefの長い 長いLL。 const int型 MAXN = 1000年 + 7 。 構造体ノード{ int型X、Y、Z。 ブール 演算子 <(constのノードやその他)のconst { 戻り これを - > X <other.x。// X、Y、Z、存长高宽、再将长排序 } }ノード[MAXN]。 INT のmain() { int型のn; int型 casee = 0 ; 一方、(〜のscanf(" %d個"、&N)&& N) { INT [MAXN]高いです。 memsetの(高、0、はsizeof (高))。 int型 NUM [ 3 ]。 int型のk = 0 。 以下のための(int型I = 0、I <N - 、I ++は) { scanfの(" %D%D%D "、およびNUM [ 0 ]、&NUM [ 1 ]、&NUM [ 2 ]); ソート(NUM、NUM + 3); // この種LWH 3ビット数、再割り当て約縦横 ノード[K] .X = NUM [ 2 ]、 ノード[K] .Y = NUM [ 1 ]、 ノード[K。++] Z = NUM [ 0 ]; // このような長さより長い幅より、以下がより長い隣接する長方形のアスペクト都合より決定されるように 、ノード[K] .X = NUM [ 2 ]、 ノード[K] .Y = NUM [ 0 ]。 ノード[K ++] NUM = Zを[ 1 ]、 ノード[K] .X = NUM [ 1 ]、 ノード[K] .Y = NUM [ 0 ]、 ノード[K。++] Z = NUM [ 2 ]; } ソート(ノード、ノード + K); // このとき、その後の矩形は、すべての完全なソートの状態に長い直方体 INT hightmax = 0 ; のため(int型私は= 0 ; Iは、Kを<; Iは++ ) { ため(INT I- = J 1、J> = 0 ; J、 ) { IF(ノード[I] .X>ノード[j]は.X &&ノード[I] .Y>ノード[j]が.Y &&高い[I] < ハイ[J]) 高[I] = 高[J]。 } 高い[I] + = ノード[i]は.Z。 もし(hightmax < ハイ[i])と hightmax = 高[I]; } のprintf(" ケース%D:最大高さ=%d個の\ n "、++ casee、hightmax)。 } 戻り 0 。 }