zoukankan      html  css  js  c++  java
  • [Swust OJ 585]--倒金字塔(LIS最长不下降子序列)

    题目链接:http://acm.swust.edu.cn/problem/585/

    Time limit(ms): 3000      Memory limit(kb): 65535
     
    SWUST国的一支科学考察队到达了举世闻名的古埃及金字塔。 
    关于金字塔的建造一直是一个未解之谜, 有着“西方史学之父”之称的希罗多德认为,金字塔的建造是人力和牲畜,花费20 年时间从西奈半岛挖掘天然的石头运送到埃及堆砌而成。也有不少人认为是外星人修建的。人们发现胡夫金字塔的经线把地球分成东、西两个半球,它们的陆地面积是相等的,这种“巧合”大概是外星人选择金字塔建造地点的用意。法国化学家戴维·杜维斯则认为,建造金字塔的巨石不是天然的,而是人工浇筑的。 
    SWUST 国科考队的队员们正准备研究戴维·杜维斯提出的假说。为了研究这种假说,他们需要用到“倒金字塔模型”。所谓倒金字塔模型,即金字塔由N 层人工浇筑的巨石堆砌而成,非底层的任意一层巨石的长度和宽度都必须要小于等于它下面的一层巨石的长度和宽度。 
    现在,科考队队员们打算用手里仅有N 块木板去模拟这个倒金字塔模型。请计算出科考队队员们能够构建的倒金字塔模型的最大高度。
    Description
    测试数据的第1 行,为一个正整数N(N <= 100000),表示科考队队员们手里一共有N 块木板。 
    接下来N 行,每行两个数:a,b( a, b <= 100000),分别表示一块木板的长度与宽度。
    Input
    只有一个正整数,为最多可以堆叠的倒金字塔的高度。所有的木板厚度均为1。
    Output
    1
    2
    3
    4
    5
    3
    3 2
    1 1
    2 2
     
    Sample Input
    1
    2
    3
     
    Sample Output
     
     
    解题思路:先按照一个坐标为基准升序排序,然后求最长不下降子序列(LIS),
                     这里由于测试数据较多(100000),在dp时采用二分查找,这样T(n)=O(nlog2n).~~
    关于LIS可以戳戳这里http://www.cnblogs.com/zyxStar/p/4296704.html
     
    代码如下:
     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 struct node{
     6     int x, y;
     7     bool operator<(const node &tmp)const{
     8         if (x != tmp.x) 
     9             return x < tmp.x;
    10         return y < tmp.y;
    11     }
    12 }tower[100005];
    13 
    14 int n, len, dp[100005];
    15 
    16 int binary_search(int key, int low, int high){
    17     while (low < high){
    18         int mid = (low + high) >> 1;
    19         if (key >= dp[mid]) 
    20             low = mid + 1;
    21         else  high = mid;
    22     }
    23     return low;
    24 }
    25 
    26 int main(){
    27     int i, j;
    28     while (cin >> n){
    29         for (i = 0; i < n; i++) cin >> tower[i].x >> tower[i].y;
    30         sort(tower, tower + n);
    31         dp[1] = tower[0].y, len = 1;
    32         for (i = 1; i < n; i++){
    33             if (dp[len] <= tower[i].y)  j = ++len;
    34             else
    35                 j = binary_search(tower[i].y, 1, len + 1);
    36             dp[j] = tower[i].y;
    37         }
    38         cout << len << endl;
    39     }
    40     return 0;
    41 }
    View Code
  • 相关阅读:
    spring集成环境下的axis webservice的发布,调试
    Axis2 webservice 之使用java调用webservice
    Axis2 webservice入门--写个简单的webservice
    Axis2 webservice入门--开发环境搭建,概念理解
    使用js给页面显示的图片添加水印效果
    java使用dom4j解析xml文件
    一个Java递归程序
    Java-Scanner键盘输入
    JVM—调优参数学习
    JVM—类加载过程
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4564673.html
Copyright © 2011-2022 走看看