贪心策略一:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5005;
struct stick
{
int l;
int w;
int k;//记录状态
}Stick[N];
bool cmp(stick a,stick b)
{
if(a.l!=b.l)
return a.l<b.l;
else
return a.w<b.w;
}
int main()
{
int T,n,A,B;
int temp;
int ans;
int l_t,w_t;
int k1;
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>A>>B;
Stick[i].l=A;
Stick[i].w=B;
Stick[i].k=1;
}
sort(Stick,Stick+n,cmp);
temp=0;
k1=0;
ans=0;
while(temp!=n)
{
l_t=0;w_t=0;
for(int i=k1;i<n;i++)
{
if(Stick[i].k==1);
{
k1=i;
break;
}
}
for(int i=k1;i<n;i++)
{
if(Stick[i].k&&Stick[i].l>=l_t&&Stick[i].w>=w_t)
{
temp++;
Stick[i].k=0;
l_t=Stick[i].l;
w_t=Stick[i].w;
}
}
ans++;
}
cout<<ans<<endl;
}
system("pause");
return 0;
}
贪心策略二:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=5005;
struct stick
{
int l;
int w;
}Stick[N];
bool cmp(stick a,stick b)
{
if(a.l!=b.l)
return a.l>b.l;
else
return a.w>b.w;
}
int main()
{
int T,n,ans,A,B;
cin>>T;
while(T--)
{
cin>>n;
ans=n;
for(int i=0;i<n;i++)
{
cin>>A>>B;
Stick[i].l=A;
Stick[i].w=B;
}
sort(Stick,Stick+n,cmp);
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{
if(Stick[j].l>=Stick[i].l&&Stick[j].w>=Stick[i].w)
{
Stick[j].l=Stick[i].l;
Stick[j].w=Stick[i].w;
Stick[i].l=0;
Stick[i].w=0;
ans--;
break;
}
}
cout<<ans<<endl;
}
system("pause");
return 0;
}