友好城市

来源:互联网 发布:巨人网络财务报表 编辑:程序博客网 时间:2024/06/09 22:48

Problem Description

Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。

Input

输入的第一行为T,表示测试示例的个数。对于每组测试数据,
第1行,一个整数N(1<=N<=5000),表示城市数。
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。(0<=xi<=10000)

Output

对于每组测试数据,仅一行,输出一个整数,表示政府所能批准的最多申请数。

Sample Input

1 7 22 4 2 6 10 3 15 12 9 8 17 17 4 2

Sample Output

 4
/*最长升子序列的延生:   排序:南岸(x)排升序,再排北岸(y)升序    从第二个数开始,拿北岸的与前面的比,看是否大于前面的,满足就加一次*/#include<cstdio>#include<malloc.h>#include<algorithm>#include<iostream>using namespace std;struct  mad{    int x;    int y;    int c;};bool cmp(mad i, mad j) //排序{    if(i.x != j.x) return i.x < j.x;    else return i.y < j.y;}int main(){    int t, i, j, ma, mi, max, w, n;    mad *a;    while(scanf("%d", &t) != EOF && t)    {        while(t--)        {            scanf("%d", &n);            a = (mad *)malloc(sizeof(mad) * n);            for(i = 0; i < n; i++)            {                scanf("%d%d", &a[i].x, &a[i].y);                a[i].c = 1;            }            sort(a, a + n, cmp);            for(i = 1; i < n; i++)            {                max = 0;                for(j = 0; j < i; j++)                {                    if(a[i].y > a[j].y && max < a[j].c)                        max = a[j].c;                }                a[i].c += max;            }            for(i = 0, max = 0; i < n; i++)                if(max < a[i].c) max = a[i].c;            printf("%d\n", max);            free(a);        }    }    return 0;}

0 0
原创粉丝点击