题目描述
一个学校里老师要将班上N个同学排成一列,同学被编号为1∼N,他采取如下的方法:
先将1号同学安排进队列,这时队列中只有他一个人;
2−N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1∼(i−1)中某位同学(即之前已经入列的同学)的左边或右边;
从队列中去掉M(M<N)个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
输入输出格式
输入格式:
第1行为一个正整数N,表示了有N个同学。
第2-N行,第ii行包含两个整数k,p,其中k为小于ii的正整数,p为0或者1。若p为0,则表示将i号同学插入到k号同学的左边,p为1则表示插入到右边。
第N+1行为一个正整数M,表示去掉的同学数目。
接下来M行,每行一个正整数x,表示将x号同学从队列中移去,如果x号同学已经不在队列中则忽略这一条指令。
输出格式:
1行,包含最多N个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。
输入输出样例
输入
4
1 0
2 1
1 0
2
3
3
输出
2 4 1
链表
运行时间太慢
#include<stdio.h>
#include<stdlib.h>
int dis[100001];
int x[100001];
int y[100001];
struct NODE
{
int mark;
int leap;
struct NODE *next;
};
int main(void)
{
int i;
int N,M;
scanf("%d",&N);
for(i=2;i<=N;i++)
scanf("%d%d",&x[i],&y[i]);
scanf("%d",&M);
int ans;
for(i=1;i<=M;i++)
{
scanf("%d",&ans);
dis[ans]++;
}
struct NODE *head=(struct NODE*)malloc(sizeof(struct NODE));
struct NODE *p=(struct NODE*)malloc(sizeof(struct NODE));
p->next=NULL;
head->next=p;
p->mark=1;
if(dis[1]==0)
p->leap=1;
else
p->leap=0;
for(i=2;i<=N;i++)
{
struct NODE *stu=(struct NODE*)malloc(sizeof(struct NODE));
stu->mark=i;
stu->next=NULL;
if(dis[i]==0)
stu->leap=1;
else
stu->leap=0;
p=head;
while(p->next)
{
if(p->next->mark==x[i])
break;
p=p->next;
}
if(y[i]==1)
p=p->next;
stu->next=p->next;
p->next=stu;
}
p=head->next;
while(p)
{
if(p->leap==1)
printf("%d ",p->mark);
p=p->next;
}
}
看了大佬的思路后 发现数组也能实现类似链表的功能
**通过二维
a[1][1]表示自身
a[1][2]表示左边的人
a[1][3]表示右边的人**
插入或者删除均可以通过修改数组来实现
记录下该队伍处于最左端人的序号
最后通过该最左端人的序号来依次写出整个队列
#include<stdio.h>
int a[100001][4];
int main(void)
{
int i;
int N,M;
scanf("%d",&N);
a[1][1]=1;
int start=1;
for(i=2;i<=N;i++)
{
a[i][1]=i;
int x,y;
scanf("%d%d",&x,&y);
if(y==0)
{
a[a[x][2]][3]=i;
a[i][2]=a[x][2];
a[i][3]=x;
a[x][2]=i;
if(x==start)
start=i;
}
else
{
a[a[x][3]][2]=i;
a[i][3]=a[x][3];
a[x][3]=i;
a[i][2]=x;
}
}
scanf("%d",&M);
int s;
for(i=1;i<=M;i++)
{
scanf("%d",&s);
if(a[s][1])
{
if(s==start)
start=a[start][i];
a[a[s][2]][3]=a[s][3];
a[a[s][3]][2]=a[s][2];
a[s][1]=0;
N--;
}
}
int ans=start;
for(i=1;i<=N;i++)
{
printf("%d ",a[ans][1]);
ans=a[ans][3];
}
}