有一堆n个木棍。每个棒的长度和重量是预先知道的。木棒要用木工机械逐一加工。它需要一些时间,称为设置时间,机器准备加工一根棍子。安装时间与清洗操作和更换机器中的工具和形状有关。木工机床的安装时间如下:

(a)第一根木棍的安装时间为1分钟。

(b)在加工长度l和重量w的棒材之后,如果l<=l'和w<=w',机器将不需要长度l'和重量w'的棒材的安装时间。否则,安装需要1分钟。

你要找到最小的设置时间来处理给定的一堆木棒。例如,如果有5根棍子的长度和重量对(4,9)、(5,2)、(2,1)、(3,5)和(1,4),那么最小设置时间应该是2分钟,因为存在一系列对(1,4)、(3,5)、(4,9)、(2,1)、(5,2)。

 

对于题目例子中的(4,9)、(5,2)、(2,1)、(3,5)和(1,4),经过排序后得到的是(1,4)、(2,1),(3,5),(4,9),(5,2)

首先从(1,4)开始向右搜索,发现(2,1)未被计算过,但是不满足情况,那么将该位置记为start(每次搜索前被赋值为n(坐标点的个数)),作为下次搜索的起点,继续向右发现(3,5)满足情况,那么重新将(3,5)作为与下一个比较的点并且标记为已计算,与(4,9)比较,满足情况,则(4,9)与(5,2)比较发现不满足情况,但是已到达尾部,开始下一次搜索,开始位置为start,即(2,1),由于(3,5),(4,9)已经被标记为计算过,将与(5,2)进行匹配,成功,标记为已计算,没有发现匹配不成功的情况,故start位置为n,下次匹配不会进行,即完成全部计算

#include <iostream>
#include <cmath>
#include <math.h>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
    int a,b,c;
}n[10010];
bool cmp(node p1,node p2)
{
    if(p1.a == p2.a)
        return p1.b < p2.b;
    return p1.a < p2.a;
}
int main()
{
    int t,m,ans = 0;
    scanf("%d",&t);
    while(t--)
    {
        ans = 0;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&n[i].a,&n[i].b);
            n[i].c = 1;
        }
        sort(n+1,n+1+m,cmp);

        int k = 1;
        int temp = 0;
        while(temp != m){
            int x = 0,y = 0;
            for(int i=k;i<=m;i++)
                if(n[i].c){
                    k = i;
                    break;
                }
            for(int i=k;i<=m;i++)
            {
                if(!n[i].c)
                    continue;
                if(n[i].a >= x && n[i].b >= y){
                    temp++;
                    n[i].c = 0;
                    x = n[i].a;
                    y = n[i].b;
                }
            }
            ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}