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;
}











目录
相关文章
codeforces 285C - Building Permutation
题目大意是有一个含n个数的数组,你可以通过+1或者-1的操作使得其中的数是1--n中的数,且没有重复的数。 既然是这样的题意,那么我就应该把原数组中的数尽量往他最接近1--n中的位置放,然后求差绝对值之和,但有多个数,怎么使他们和最小,这样就要对其进行排序了,直接按大小给它们安排好位置,然后计算。
34 0
|
6月前
|
Java
HDU-2199-Can you solve this equation?
HDU-2199-Can you solve this equation?
37 0
|
图形学
hdu1086 You can Solve a Geometry Problem too(判断线段相交)
hdu1086 You can Solve a Geometry Problem too(判断线段相交)
71 0
LeetCode 279. Perfect Squares
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
69 0
LeetCode 279. Perfect Squares
HDU-1097,A hard puzzle(快速幂)
HDU-1097,A hard puzzle(快速幂)
|
算法 Go
HDU-1548,A strange lift(Dijkstra)
HDU-1548,A strange lift(Dijkstra)
HDOJ(HDU) 1898 Sempr == The Best Problem Solver?(水题、、、)
HDOJ(HDU) 1898 Sempr == The Best Problem Solver?(水题、、、)
125 0
HDOJ(HDU) 2136 Largest prime factor(素数筛选)
HDOJ(HDU) 2136 Largest prime factor(素数筛选)
109 0