其实自己对于贪心法的理解,还是很不够
开始我想的是,这个问题,就相当于矩形嵌套,只不过相同大小的也可以放进去。那么后放进去的面积一定不比前面的小,于是我先按面积排,再分别按照两个边排,结果却wa。。而正确的是,先按一边排,相同时再按另一边排。对于为什么这样错了,我的一个想法是,如果放进去的一个面积最大的矩形长宽比太大,就会导致之后很多矩形放不进去,而这些长宽比较大的矩形,如果放在一起,就可以得到更好地答案。。。为什么我总是想得和最优解不一样?。。。TT
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 5100
using namespace std;
struct node
{
int a,b;
bool operator <(node other)
{
if(a<other.a)
return 1;
else if(a==other.a&&b<=other.b)
return 1;
return 0;
}
}nod[MAX];
int state[MAX];
int main()
{
int t,n,i,j,a,b,all;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d",&nod[i].a,&nod[i].b);
sort(nod,nod+n);
all=0;
memset(state,0,MAX*4);
for(i=0;i<n;i++)
{
if(state[i]==1)
continue;
a=nod[i].a,b=nod[i].b;
for(j=i+1;j<n;j++)
if(state[j]==0&&a<=nod[j].a&&b<=nod[j].b)
{
//printf("c%d",j);
state[j]=1;
a=nod[j].a,b=nod[j].b;
}
}
/*for(i=0;i<n;i++)
printf("aa%d %d\n",nod[i].a,nod[i].b);*/
for(i=0;i<n;i++)
if(!state[i])
{
all++;
printf("b%d\n",i);
}
printf("%d\n",all);
}
return 0;
}