您的位置:首页 > 其它

poj3636 Nested Dolls

2012-03-14 13:21 316 查看


分析:偏序关系。如果采用poj1065的方法超时,所以用一个数组D[2100],吧每个偏序链的末端 保存起来,不断更新。

#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

struct node{

int w,h;

}doll[21000],D[2100];

int cmp(node x,node y)

{

if(x.w!=y.w)

return x.w<y.w;

else

return x.h>y.h;

}/*

int cmp(const void *x,const void *y)

{

if( ((struct node*)x)->l != ((struct node *)y)->l)

return ((struct node *)x)->l-((struct node*)y)->l;

else

return ((struct node*)x)->w-((struct node *)y)->w;

}*/

int main()

{

int t,i,j;

scanf("%d",&t);

while(t--)

{

int n,i,j,ans=0;

bool flag;

scanf("%d",&n);

for(i=0;i<n;i++)

{

//cin>>doll[i].w>>doll[i].h;

scanf("%d %d",&doll[i].w,&doll[i].h);

}

sort(doll,doll+n,cmp);//Ϊʲô²»¶Ô£¡£¡£¡£¡£¡£¡£¡

// qsort(a,n,sizeof(a[0]),cmp);

/*for(i=0;i<n;i++)

cout<<doll[i].w<<"***"<<doll[i].h<<endl;*/

for(i=0;i<n;i++)

{

flag=false;

for(j=0;j<ans;j++)

{

if(doll[i].w>D[j].w && doll[i].h>D[j].h)

{

D[j]=doll[i];

flag=true;

break;

}

}

if(flag==false)

D[ans++]=doll[i];

}

printf("%d\n",ans);

}

return 0;

}

//c++做法,思想是一样的

#include<iostream>

#include<cstdio>

#include<vector>

#include<map>

#include<algorithm>

using namespace std;

struct doll

{

int w,h;

};

vector<doll>a;

vector<doll>b;

int cmp(doll x,doll y)

{

return x.w<y.w||x.w==y.w&&x.h>y.h;

}

int main()

{

int t;

cin>>t;

while(t--)

{

int n;

scanf("%d",&n);

doll d;

a.clear(),b.clear();

for(int i=0;i<n;i++)

{

scanf("%d %d",&d.w,&d.h);

a.push_back(d);

}

sort(a.begin(),a.end(),cmp);

for(int i=0;i<n;i++)

{

bool flag=false;

for(int j=0;j<b.size();j++)

{

if(a[i].w>b[j].w&&a[i].h>b[j].h)

{

b[j].w=a[i].w;

b[j].h=a[i].h;

flag=true;

break;

}

}

if(flag==false)

{

b.push_back(a[i]);

}

}

printf("%d\n",b.size());

}

//system("pause");

return 0;

}

/***********************************************

二分法优化:



二分 果然厉害,瞬间 从563减少到172,将近减少400ms,

#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

struct node{

int w,h;

}doll[21000];

int D[2100];

int cmp(node x,node y)

{

if(x.w!=y.w)

return x.w<y.w;

else

return x.h>y.h;

}

int main()

{

int t,i,j;

scanf("%d",&t);

while(t--)

{

int n,i,j;

bool flag;

scanf("%d",&n);

for(i=0;i<n;i++)

{

//cin>>doll[i].w>>doll[i].h;

scanf("%d %d",&doll[i].w,&doll[i].h);

}

sort(doll,doll+n,cmp);

int len=0,l=0,r,mid;

for(i=0;i<n;i++)

{

l=0,r=len;

while(l<r)//¶þ·ÖÓÅ»¯

{

mid=(l+r)/2;

if(D[mid]>=doll[i].h)

l=mid+1;

else

r=mid;

}

if(len==l)

len++;

D[l]=doll[i].h;

}

printf("%d\n",len);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: