codevs 1689 建造高塔

1689 建造高塔

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题目描述 Description

n有n种石块,石块能无限供应。每种石块都是长方体,其中第i种石块的长、宽、高分别为li、wi、hi。石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度。如果要把一个石块放在另一个石块上面,必须保证上面石块的长和宽都分别严格小于下面石块的长和宽。这意味着,即使两块长宽相同的石块也不能堆砌起来。

现在神犇想知道,最多能用上多少块石头呢?

输入描述 Input Description

第一行,N; 
以下N行,每行三个数,表示第i种石头的长宽高。

输出描述 Output Description

一个整数,表示最多能用上多少块石头。

样例输入 Sample Input

3
1 1 1
2 2 2
3 3 4

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

N≤50000,其余数字≤maxlongint。

/*
排序+LIS
O(n*n)做法可以的60分
刚开始打的n*n的最长上升子序列
*/
/*
排序时一点小技巧
把结构体按长从小到大排序
如果长相等则把宽大的排前面
这样就可以转化成求宽的最长上升子序列了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 50010
using namespace std;
struct node
{
    int l;
    int s;
}e[maxn*6];
int n,tot,len,c[maxn*6];
int cmp(node x,node y)
{
    if(x.l<y.l)return 1;
    if(x.l==y.l&&x.s>=y.s)return 1;
    return 0;
}
int main()
{
    int i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        e[++tot].l=x;e[tot].s=y;
        e[++tot].l=x;e[tot].s=z;
        e[++tot].l=y;e[tot].s=z;
        e[++tot].l=y;e[tot].s=x;
        e[++tot].l=z;e[tot].s=x;
        e[++tot].l=z;e[tot].s=y;
    }
    sort(e+1,e+tot+1,cmp);
    for(i=1;i<=tot;i++)
    {
        if(e[i].s>c[len])
        c[++len]=e[i].s;
        else
        {
            //int mx=lower_bound(c+1,c+len+1,e[i].s)-c;
            int l=1,r=len,mx;
            while(l<=r)
            {
                int mid=(l+r)/2;
                if(e[i].s<=c[mid])
                {
                    mx=mid;
                    r=mid-1;
                }
                else
                l=mid+1;
            }
            c[mx]=e[i].s;
        }
    }
    printf("%d\n",len);
    return 0;
}
时间: 2024-10-08 15:57:12

codevs 1689 建造高塔的相关文章

codevs 1689 搭建高塔

/*机智sort二维转一维*/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 50010 using namespace std; int n,s,num,c[maxn*6]; struct node { int l,r; }a[maxn*6]; int cmp(const node &x,const node &y

建造高塔(codevs 1689)

题目描述 Description n有n种石块,石块能无限供应.每种石块都是长方体,其中第i种石块的长.宽.高分别为li.wi.hi.石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度.如果要把一个石块放在另一个石块上面,必须保证上面石块的长和宽都分别严格小于下面石块的长和宽.这意味着,即使两块长宽相同的石块也不能堆砌起来. 现在神犇想知道,最多能用上多少块石头呢? 输入描述 Input Description 第一行,N: 以下N行,每行三个数,表示第i种石头的长宽高. 输出描述 Out

建造高塔

[题目描述] 有N种石块,石块能无限供应.每种石块都是长方体,其中第i种石块的长.宽.高分别为Li.Wi.Hi.石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度.如果要把一个石块放在另一个石块上面,必须保证上面石块的长和宽都分别严格小于下面石块的长和宽.这意味着,即使两块长宽相同的石块也不能堆砌起来. 现在询问最多能用上多少块石头. [输入描述] 第一行,一个数N:以下N行,每行三个数,分别表示第i种石头的长.宽.高. [输出描述] 一个整数,表示最多能用上多少块石头. [样例输入] 3

设计模式之七:建造模式(Builder Pattern)

建造者模式就是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示. 适用范围: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同表示时. 建造者模式里面有四个角色: Builder: 给出一个抽象接口,以规范产品对象的各个组成部分的建造.一般而言,此接口独立于应用程序的业务逻辑.模式中直接创建产品对象的具体创建者角色.具体创建者角色必须实现这个接口的所有方法:一个是建造方法,另一个是结果返还方法. ConcreteBu

[ CodeVS冲杯之路 ] P2492

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,

[CODEVS 1281] Xn数列

描述 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn http://codevs.cn/problem/1281/ 分析 比较裸的矩阵乘法题, 好久没做了, 写写思路 假设矩阵 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }. 根据矩阵乘法的计算方法, 有 : A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }. 那

Codevs 1257 打砖块

1257 打砖块 http://codevs.cn/problem/1257/ 题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[i,j](a[i,j]<=50).下面是一个有5层砖块的例子.如果你要敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它,若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖. 你的任务是从一个有n(n<=5

codevs——T1219 骑士游历

 http://codevs.cn/problem/1219/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2,y2的合法路径条数. 输入描述 Input Description 第一行2个整数n和m 第二行4个

1683 车厢重组 codevs

http://codevs.cn/problem/1683/ 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序.于是他就负责用这座桥将进站的车厢按车厢号从小到大排列.他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序