HDU-2199-Can you solve this equation

简介: HDU-2199-Can you solve this equation



Bridging signals

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


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      

题意分析:   此题不难看懂 就是让 找出一组数的最长升序子序列的长度   比如 4 2 6 3 1 5 要想找到去掉一些线后的最多不交叉线的条数 那么不就是求这组数据里面 的最长升序的长度吗不就是 2 3 5 怎么找看下面代码吧! 看第一种做法会更好理解是怎么找的 用的是等效替代 最终找出了 1 3 5 序列并不是 2 3 5 但是他的长度 一定是2 3 5 的长度也即是最长子序列的长度


这是我开始写的代码   二分 加 最长升序列查找  但是提交后是超时 很是郁闷


#include<cstdio>
#include<cstring>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int i,m;
        int a[100],b[100];
        memset(b,0,sizeof(b));
        scanf("%d",&m);
        for(i=1;i<=m;i++)
           scanf("%d",&a[i]);
          int k=1;
          b[1]=a[1];
        for(i=2;i<=m;i++)
        {
            //for(j=1;j<=k;j++)
            if(a[i]>b[k])
            {
                k++;
                b[k]=a[i];
            }
            else
            {
                int mid=0,x,left=0,right=k;
                while(left<right)
                {
 
 
 
 
                    mid=ceil((left+right)/2.0);
                    x=mid;
                    if(mid==left||mid==right)
                       break;
                    if(b[mid]<a[i])
                        left=mid;//,x=left;
                    else
                        right=mid;//,x=right;
                }
                //k=right;
                b[x]=a[i];
            }
        }
        printf("%d\n",k);
    }
    return 0;
}


这个是用    这两个

二分法 (方程求解) 函数写的就过了

lower_bound(begin,end,index)

找到大于等于某值的第一次出现

upper_bound(begin,end,index)

找到大于某值的第一次出现

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define maxn 45000
int a[maxn],b[maxn];
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int i,x,m;
        memset(b,0,sizeof(b));
        scanf("%d",&m);
        for(i=0;i<m;i++)
           scanf("%d",&a[i]);
          int k=0;
          b[0]=a[0];
        for(i=1;i<m;i++)
        {
            if(a[i]>b[k])
            {
                k++;
                b[k]=a[i];
            }
            else
            {
                x=lower_bound(b,b+k,a[i])-b;
 
                b[x]=a[i];
            }
        }
        printf("%d\n",k+1);
        //for(i=1;i<=k;i++)
           //printf("%d  ",b[i]);
    }
    return 0;
}











目录
相关文章
|
消息中间件 存储 网络协议
我们一起来学RabbitMQ 五:RabbitMQ 应知应会的面试题
我们一起来学RabbitMQ 五:RabbitMQ 应知应会的面试题
171 0
|
6月前
|
数据安全/隐私保护
基于双PI+SVPWM的船舶用PMSM控制系统simulink建模与仿真
本课题基于双PI控制器与SVPWM技术,构建船舶用永磁同步电机(PMSM)控制系统的Simulink模型并进行仿真。系统采用电流内环与速度外环的双闭环结构,实现快速响应、高精度的电流与速度控制。SVPWM模块将电压参考值转化为三相PWM信号驱动逆变器。通过MATLAB2022a完成建模与仿真,验证了系统在高性能、环境适应性及控制精度方面满足船舶推进需求,适用于复杂海洋工况。
|
前端开发 UED
Angular 动画教程超赞!掌握让应用更具交互性的技巧,开启精彩的前端动画之旅!
【8月更文挑战第31天】在现代前端开发中,提升用户体验至关重要,而动画是增强应用交互性的有效手段。Angular 提供了强大的动画功能,可轻松添加各种动画效果。本文介绍了 Angular 动画的基本概念、使用动画模块、事件触发动画、动画序列与并行执行、性能优化及结合第三方动画库等最佳实践。通过遵循这些实践,可以充分发挥 Angular 动画的优势,提升用户体验。下面是一个简单的示例应用,展示了如何使用 Angular 动画实现元素的显示和隐藏效果。
180 0
|
JSON Kubernetes 数据格式
k8s集群namespace一直处于Terminating状态不释放解决办法
k8s集群namespace一直处于Terminating状态不释放解决办法
974 0
|
机器学习/深度学习 缓存 Shell
VSCode上的Git使用手记(持续更新ing...)
本笔记是我想要学习如何将本地文件发布到GitHub上时开始看廖雪峰的Git教程,然后打开了VSCode,发现VSCode上面集成的Git辅助使用功能真的很好用…… 基本上到了不用看教程都可以猜懂的地步。 为了整理、规范使用技巧,在经过了一番学习和试验之后,觉得以这样一篇使用手记的形式发布使用技巧相关的博文,以记录和沉淀经验,并帮助更多Git和VSCode初学者少踩坑。 本文参考的教程、文档等内容见本文末尾。
VSCode上的Git使用手记(持续更新ing...)
|
SQL 存储 关系型数据库
|
Python
python-- logging 模块
python-- logging 模块
UVa872 - Ordering(拓扑排序)
UVa872 - Ordering(拓扑排序)
87 0
|
传感器 网络协议 网络性能优化
《计算机网络》期末复习—第一章:概述
《计算机网络》期末复习—第一章:概述
197 0