Bridging signals

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 961    Accepted Submission(s):
627

Problem Description
'Oh no, they've done it again', cries the chief
designer at the Waferland chip factory. Once more the routing designers have
screwed up completely, making the signals on the chip connecting the ports of
two functional blocks cross each other all over the place. At this late stage of
the process, it is too
expensive to redo the routing. Instead, the engineers
have to bridge the signals, using the third dimension, so that no two signals
cross. However, bridging is a complicated operation, and thus it is desirable to
bridge as few signals as possible. The call for a computer program that finds
the maximum number of signals which may be connected on the silicon surface
without rossing each other, is imminent. Bearing in mind that there may be
housands of signal ports at the boundary of a functional block, the problem asks
quite a lot of the programmer. Are you up to the task?

Figure 1. To the left: The two blocks' ports
and their signal mapping (4,2,6,3,1,5). To the right: At most three signals may
be routed on the silicon surface without crossing each other. The dashed signals
must be bridged.

A typical situation is schematically depicted in figure
1. The ports of the two functional blocks are numbered from 1 to p, from top to
bottom. The signal mapping is described by a permutation of the numbers 1 to p
in the form of a list of p unique numbers in the range 1 to p, in which the i:th
number pecifies which port on the right side should be connected to the i:th
port on the left side.
Two signals cross if and only if the straight lines
connecting the two ports of each pair do.

 
Input
On the first line of the input, there is a single
positive integer n, telling the number of test scenarios to follow. Each test
scenario begins with a line containing a single positive integer p<40000, the
number of ports on the two functional blocks. Then follow p lines, describing
the signal mapping: On the i:th line is the port number of the block on the
right side which should be connected to the i:th port of the block on the left
side.
 
Output
For each test scenario, output one line containing the
maximum number of signals which may be routed on the silicon surface without
crossing each other.
 
Sample Input
4
6
4
2
6
3
1
5
 
10
2
3
4
5
6
7
8
9
10
1
 
 
8
8
7
6
5
4
3
2
1
 
9
5
8
9
2
3
1
7
4
6
 
Sample Output
3
9
1
4
题意:从左侧的图中去掉一些线段使剩余的线段都不相交,问最多能够剩下多少条线段
题解:由观察可知要想剩下的线段都不相交,则要求右侧线为单调递增的排序因为数据很大为避免超时
        用二分法求最大递增序列的长度
求最大子序列长度的原理:
      用一组数据来说明:5 8 9 2 3 1 7 4 6
显然我们可以观察出最长的子序列是2 3 4 6长度为四,设出一个数组a[]来存放子序列 设top=1为子序列长度;
接下来我们一个一个遍历  首先是5 则a[top++]=5;然后是8因为8>5所以a[top++]=8;9>8所以a[top++]=9
此时a数组中的元素为5 8 9;接下来遍历到2;因为5在当前a数组中最小而2<5,所以用2来覆盖5此时数组a变为2 8 9
接下来遍历到3因为2<3<8所以用3覆盖8此时数组a变为2 3 9接下来同理1覆盖2;7覆盖9;4覆盖7;到6时因为数组a
中所有数都比6小所以a[top++]=6;此时数组a中元素为1 3 4 6长度为top;(此法只能用来求最大递增子序列的长度
不能打印出最大递增子序列)
AC代码:
#include<stdio.h>
#include<string.h>
int main()
{
int t;
int p,top,l,r,mid,i,m;
int a[44000];
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
scanf("%d",&a[0]);
int top=0;
for(i=1;i<p;i++)
{
scanf("%d",&m);
if(a[top]<m)
a[++top]=m;
else
{
l=0;r=top;mid=0;
while(r>=l)
{
mid=(r+l)/2;
if(a[mid] < m)
l=mid+1;
else
r=mid-1;
}
a[r+1]=m;
}
}
printf("%d\n",top+1);
}
return 0;
}

  

hdoj 1950 Bridging signals【二分求最大上升子序列长度】【LIS】的更多相关文章

  1. (hdu)1950 Bridging signals(最长上升子序列)

    Problem Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip f ...

  2. hdu 1950 Bridging signals 求最长子序列 ( 二分模板 )

    Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. poj 1631 Bridging signals (二分||DP||最长递增子序列)

    Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9234   Accepted: 5037 ...

  4. HDU 1950 Bridging signals【最长上升序列】

    解题思路:题目给出的描述就是一种求最长上升子序列的方法 将该列数an与其按升序排好序后的an'求出最长公共子序列就是最长上升子序列 但是这道题用这种方法是会超时的,用滚动数组优化也超时, 下面是网上找 ...

  5. HDU 1950 Bridging signals (DP)

    职务地址:HDU 1950 这题是求最长上升序列,可是普通的最长上升序列求法时间复杂度是O(n*n).显然会超时.于是便学了一种O(n*logn)的方法.也非常好理解. 感觉还用到了一点贪心的思想. ...

  6. HDU 1950 Bridging signals(LIS)

    最长上升子序列(LIS)的典型变形,O(n^2)的动归会超时.LIS问题可以优化为nlogn的算法. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元 ...

  7. Poj 1631 Bridging signals(二分+DP 解 LIS)

    题意:题目很难懂,题意很简单,求最长递增子序列LIS. 分析:本题的最大数据40000,多个case.用基础的O(N^2)动态规划求解是超时,采用O(n*log2n)的二分查找加速的改进型DP后AC了 ...

  8. HDU 1950 Bridging signals

    那么一大篇的题目描述还真是吓人. 仔细一读其实就是一个LIS,还无任何变形. 刚刚学会了个二分优化的DP,1A无压力. //#define LOCAL #include <iostream> ...

  9. HDU 1950 Bridging signals (LIS,O(nlogn))

    题意: 给一个数字序列,要求找到LIS,输出其长度. 思路: 扫一遍+二分,复杂度O(nlogn),空间复杂度O(n). 具体方法:增加一个数组,用d[i]表示长度为 i 的递增子序列的最后一个元素, ...

随机推荐

  1. html-----003

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. CSS图片去色

    .imgFilter { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); ...

  3. Debian6安装XP系统

    1.下载一键包,必须要在 root目录 下执行,可以先用 pwd 命令查看当前所在目录.执行命令:wget http://d.yxlgh.com/vps/zmdebian6xp.sh 2.执行 zmd ...

  4. php 之 json格式

    /*JSON语法数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组 JSON 数据的书写格式是:名称/值对名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值;如"myw ...

  5. js更新页面,随机更新数字

    代码1: <script> function getRandom(){ var i = Math.random()*40+160; document.getElementById(&quo ...

  6. Prototype:Copy和Clone

    原型模式在C#中的实现比较直接,因为只需要继承了IClone的接口,就可以通过重写Clone方法,调用MemberwiseClone()来实现ProtoType的方式. class Test:IClo ...

  7. 学习Swift -- 拓展

    拓展(Extension) 扩展就是向一个已有的类.结构体.枚举类型或者协议类型添加新功能.这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类 ...

  8. 第三方:GDataXMLNode:xml解析库--备用

    一.GDataXMLNode说明   GDataXMLNode是Google提供的用于XML数据处理的类集.该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且 ...

  9. MySQL驱动阅读------Connection连接的建立,基于JDBC-----5.1.26

    一般获取数据库连接的程序 Class.forName("com.mysql.jdbc.Driver"); final Connection connection = (Connec ...

  10. StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全

    StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全 一.StartSSL个人证书登录申请 1.StartSSL官网: 1.官方首页:http://www.startssl.com/ 2 ...