描述

C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

输入

第一行是一个整数T(1

输出

处理这些木棒的最短时间。

样例输入

3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1

样例输出

2
1
3

 题目思路

首先排序,然后在考虑长度的基础上遍历处理掉当前可以处理的并标记,然后继续遍历,遇见没被标记的就cnt++,再次在该点遍历一遍,注意更改当前处理的最大重量

 C++

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct mb
{
    int c,z;
};
bool cmp(mb m,mb n)     //用于sort排序按木棒长度排列长度一样时按质量排列
{
    if(m.c<n.c) return true;
    else if(m.c==n.c&&m.z<n.z) return true;
    else return false;
}
int main()
{
    mb a[5010];
    int b,c,d,e,f;
    cin>>b;
    while(b--)
    {
        cin>>c;
        for(d=0;d<c;d++)
        {
            scanf("%d %d",&a[d].c,&a[d].z);
        }
        sort(a,a+c,cmp);
        f=0;
        for(d=0;d<c;d++)
        {
            if(a[d].z!=0)       //判断这个木棒是否被标记的话
            {
                f++;
                int m=a[d].z;       //赋予临时变量
                for(e=d+1;e<c;e++)    //判断下一个
                {
                    if(a[e].z>=m)    //下一个大于等于的话
                    {
                        m=a[e].z;     //更新临时变量
                        a[e].z=0;     // 并且标记
                    }
                }
            }
        }
        cout<<f<<endl;
    }
    return 0;
}