贪心,按照长度从小到大排序,然后从i开始往后扫描,长度比当前len并且重量比当前wei小的都归到同一段去;
自己还是太水
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxn=5010;
bool vis[maxn];
struct wood
{
int l,w;
wood(int ll=0,int ww=0):l(ll),w(ww){}
}woods[maxn];
bool cmp1(const wood &cn1,const wood &cn2){
return cn1.l<cn2.l||(cn1.l==cn2.l&&cn1.w<cn2.w);
}
int n;
int main(){
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (int i=0;i<n;++i)scanf("%d%d",&woods[i].l,&woods[i].w);
int ans=0;
sort(woods,woods+n,cmp1);
memset(vis,0,sizeof(vis));
for (int i=0;i<n;++i)
{
if(!vis[i]){
vis[i]=1;
ans++;
int len=woods[i].l,wei=woods[i].w;
for (int j=i+1;j<n;++j)
{
if(!vis[j]&&woods[j].l>=len&&woods[j].w>=wei){
vis[j]=1;
len=woods[j].l,wei=woods[j].w;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}