这题就是贪心算法,先对length升序排列,如果length相等,再按weight升序排列;反之亦可。然后根据题目要求进行选择即可。
不过我在写排序函数的时候出了一点问题,害得我还一度以为我的贪心策略是错的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=5005;
bool used[N];
struct point
{
int x,y;
}stick[N];
bool cmp(point a,point b)
{
if(a.x<b.x)
return true;
if(a.x==b.x)
return a.y<b.y;
return false;
}
int main()
{
int n,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&stick[i].x,&stick[i].y);
sort(stick,stick+n,cmp);
//for(int i=0;i<n;i++)
//printf("x=%d,y=%d\n",stick[i].x,stick[i].y);
memset(used,false,sizeof(used));
int ans=0;
for(int i=0;i<n;i++)
{
if(used[i])
continue;
int x=stick[i].x,y=stick[i].y;
used[i]=true,ans++;
for(int j=i+1;j<n;j++)
{
if(!used[j]&&(stick[j].x>=x&&stick[j].y>=y))
{
x=stick[j].x,y=stick[j].y;
used[j]=true;
}
}
}
printf("%d\n",ans);
}
return 0;
}