普及C组第二题(8.1)
2000. 【2015.8.6普及组模拟赛】Leo搭积木(brick)
题目:
Leo是一个快乐的火星人,总是能和地球上的OIers玩得很high。
2012到了,Leo又被召回火星了,在火星上没人陪他玩了,但是他有好多好多积木,于是他开始搭积木玩。
火星人能制造n种积木,积木能无限供应。每种积木都是长方体,第i种积木的长、宽、高分别为li、wi、hi。积木可以旋转,使得长宽高任意变换。Leo想要用这些积木搭一个最高的塔。问题是,如果要把一个积木放在另一个积木上面,必须保证上面积木的长和宽都严格小于下面积木的长和宽。这意味着,即使两块长宽相同的积木也不能堆起来。
火星上没有电脑,好心的你决定帮助Leo求出最高的塔的高度。
【提示】
每种积木都可以拆分成高度分别为li、wi、hi的三种积木,另两边作为长和宽,保证长>=宽。
输入:
第一行,一个整数n,表示积木的种数
接下来n行,每行3个整数li,wi,hi,表示积木的长宽高
输出:
一行一个整数,表示塔高的最大值
样例输入
Sample Input1:
1
10 20 30 Sample Input2:
2
6 8 10
5 5 5 Sample Input3:
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
样例输出
Sample Output1:
40 Sample Output2:
21 Sample Output3:
342
数据范围限制
对于100%的数据 n<=3000,最后答案不会超过32位整型
思路:(师出此人)
本人动态规划不咋行,所以问了一下师兄,他给我做了番解释,可能讲的不太好,看不明白请移步至他的博客。
首先考虑下长宽高的组合情况——设长宽高,x,y,z。则有六种排列组合。但是由于场必须大于宽,所以减少了一半为三种。
读题很容易知道这是线性DP中的最长单调下降序列。典型的模板题(即便我还是不会做)我们用结构体去赋值,然后我们可以将长宽分别排成两种序列。之后就是动态规划。然后就能得出答案。
CODE
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a1,b1,c1,hh=,p[],ans=;
struct jimu{
int a,b,c;
};
jimu q[];
bool mnp1(jimu x,jimu y)
{
return x.b>y.b;
}
bool mnp2(jimu x,jimu y)
{
return x.c>y.c;
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a1>>b1>>c1;
q[*i-].c=min(a1,b1);
q[*i-].c=min(a1,c1);
q[*i].c=min(b1,c1);
q[*i-].b=max(a1,b1);
q[*i-].b=max(a1,c1);
q[*i].b=max(c1,b1);
q[*i-].a=a1;
q[*i-].a=b1;
q[*i].a=c1;
}
sort(q+,q+*n+,mnp1);
for(int i=;i<=*n;i++)
{
if(q[i].b!=q[i-].b)
{
sort(q+hh,q+i,mnp2);
hh=i;
}
}
for(int i=;i<=*n;i++)
p[i]=q[i].a;
for(int i=;i<=*n;i++)
{
for(int j=i-;j>=;j--)
{
if(p[j]+q[i].a>=p[i]&&q[j].b>q[i].b&&q[j].c>q[i].c)
p[i]=p[j]+q[i].a;
}
}
for(int i=;i<=*n;i++)
{
if(p[i]>=ans)
ans=p[i];
}
cout<<ans;
return ;
}
感谢大佬给我的讲解,我将永远铭记他。
完结撒花。
我的代码也是仿照他的写的,嘿嘿
普及C组第二题(8.1)的更多相关文章
- 普及C组第二题(8.5)
1565. [GDKOI]神秘山庄 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 题目: 翠亨村是一个神秘的山庄,并不是因为它孕育了伟人孙中山,更神秘的是山 ...
- 普及C组第二题(8.4)
2266. 古代人的难题 (File IO): input:puzzle.in output:puzzle.out 时间限制: 1000 ms 空间限制: 60000 KB 题目: 门打开了, 里面 ...
- 普及C组第二题(8.2)
1340. [南海2009初中]jumpcow(牛跳) (Standard IO) 题目: John的奶牛们计划要跳到月亮上去.它们请魔法师配制了 P (1 <= P <=150,000) ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- 排座椅 2008 NOIP 普及组 第二题
题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学 ...
- 普及C组第一题(8.9)
2297. [noip普及组2(放到第一题)]棋盘 (好像重名了)(File IO): input:chess.in output:chess.out 题目描述 众所周知,国际象棋的棋盘是一个网格.国 ...
- 普及C组第一题(8.1)
1999. [2015.8.6普及组模拟赛]Wexley接苹果(apple) 题目: Wexley最近发现了一个古老的屏幕游戏.游戏的屏幕被划分成n列.在屏幕的底端,有一个宽为m列的篮子(m<n ...
- NOIP2014提高组第二题联合权值
还是先看题吧: 试题描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...
- 【枚举】Vijos P1496 火柴棒等式 (NOIP2008提高组第二题)
题目链接: https://vijos.org/p/1496 题目大意: 给你n(n<24)根火柴棍,你可以拼出多少个形如“A+B=C”的等式?("+"和"=&qu ...
随机推荐
- [CF484D] Kindergarten - 贪心
有一组数,你要把他分成若干连续段.每一段的值,定义为这一段 数中最大值与最小值的差. 求一种分法,使得这若干段的值的和最大. N < 1e6, a[i] < 1e9. 朴素的\(O(n^2 ...
- [TJOI2017] DNA - 后缀数组,稀疏表
[TJOI2017] DNA Description 求模式串与主串的匹配次数,容错不超过三个字符. Solution 枚举每个开始位置,进行暴力匹配,直到失配次数用光或者匹配成功.考虑到容错量很小, ...
- war文件—Web项目部署
war文件是什么? Web存档(war)文件包含Web应用程序的所有内容.它减少了传输文件所需要的时间. war文件的优点 节省时间:war文件将所有文件合并为一个单位. 所以在将文件从客户端传输到 ...
- document.getElementById("id").value与$("#id").val()之间的区别
本文链接:https://blog.csdn.net/mottohlm/article/details/78364196....今天在项目中遇到这么一个JS报错:原因是代码中有这么一段:对,就是var ...
- C++分割string字符串(转)
原文链接:https://blog.csdn.net/jirryzhang/article/details/80473032 或:https://www.cnblogs.com/dingxiaoqia ...
- 题解 SP27102/UVA1747 【Swap Space】
SP27102 [Swap Space] 双倍经验:UVA1747 Swap Space 用(a,b)表示每个硬盘的原容量和新文件系统下的容量.分两种情况考虑:a≤b和a>b 第一类a≤b格式化 ...
- java基础之 变量
变量是一个内存位置的名称. 1.成员变量(实例变量,属性) 成员变量就是类中的属性,当创建对象的时候,每个对象都有一份属性.一个对象中的属性就是成员变量. 2.本地变量(局部变量) 在方法内声明的变量 ...
- MySQL在cmd命令行查看端口号
在命令行输入: show global variables like 'port'; 转自:https://blog.csdn.net/zhufengy/article/details/8014778 ...
- Windows下PHP安装 Imagick 扩展
1.下载拓展下载地址一: http://windows.php.net/downloads/pecl/releases/imagick/下载地址二: https://pecl.php.net/pack ...
- 使用Samba实现文件共享:Windows和Linux之间
1.概述: 1987 年,微软公司和英特尔公司共同制定了 SMB(Server Messages Block,服务器消息 块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之 ...