/**//* 题意:n张等高的纸,每张纸有一条线,每张纸能旋转180° 问能否将全部纸凑起来,那些线段成一条 其实很简单的 对每张纸,建多一个旋转之后的纸 然后排序,排序规则按照原本是升的就升,降的就降 最后统计一下能拼在一起的个数是否为n */ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std;
const int MAXN = 50000;
struct Strip { int a,b,id; }strips[MAXN*2+10];
bool vi[MAXN+10]; int ans[MAXN+10];
bool cmp(const Strip &a,const Strip &b) { if(a.a>a.b)return a.a>b.a; return a.a<b.a; } int main() { //freopen("in","r",stdin); int h,n; while(~scanf("%d%d",&h,&n)) { int w,line=true; for(int i=1;i<=n;i++) { scanf("%d%d",&strips[i].a,&strips[i].b); strips[i].id=i; strips[i+n].a=h-strips[i].b; strips[i+n].b=h-strips[i].a; strips[i+n].id=-i; if(i==1)w=strips[i].a-strips[i].b; else if(w!=strips[i].a-strips[i].b)line=false; } if(!line){puts("0");continue;} sort(strips+1,strips+1+2*n,cmp); memset(vi,0,sizeof(vi)); int cnt=0,y=strips[1].a; for(int i=1;i<=2*n;i++) { if(vi[abs(strips[i].id)])continue; if(y==strips[i].a) { ans[++cnt]=strips[i].id; y=strips[i].b; vi[abs(strips[i].id)]=1; } } if(cnt<n)puts("0"); else { for(int i=1;i<=n;i++) printf("%d ",ans[i]); puts(""); } } return 0; }
|
|
常用链接
随笔分类
Links
搜索
最新评论
|
|