求助!40pts,悬关

P1160 队列安排

感觉这里有问题,你这个c应该是要找到最左边的人吧,但是你while里的条件意思应该是说如果a[c].l==0,就代表他是最左边的那个人,可是在你的代码里没有把将左边没人的情况下,将他的l置为0或者右边没人的情况下把它的r置为0呀,所以这样找最左边的人的话逻辑应该是错的吧。(个人想法) ```c int c; for(int i=1;i<=n;i++) { if(b[i]==1) { c=i; while(a[c].l!=0) { c=a[c].l; } break; } } ```
by sana_37 @ 2023-09-25 22:14:15


我和你的思路差不多的,AC了,你可以参考一下我的代码 ```cpp #include <iostream> using namespace std; #include<stdlib.h> #include<string.h> #include<string> int main(void) { int N; cin >> N;//输入人数 //根据人数创建 left right IsOut 数组 int* left = (int*)malloc(sizeof(int) * (N + 1)); int* right = (int*)malloc(sizeof(int) * (N + 1)); bool* IsOut = (bool*)malloc(sizeof(bool) * (N + 1)); //初始化数组 //如果左没有人的话 其left 为-1;右边没有人的话1, 其 right 为-1 memset(left, -1, sizeof(int) * (N + 1)); memset(right, -1, sizeof(int) * (N + 1)); memset(IsOut, true, sizeof(bool) * (N + 1));//一开始都未去掉,设标志位为true int index = 1;//这是记录左边第一个人的所对应的号码,一开始1号位于最左边 所以一开始index记录的是1 for (int i = 2; i <= N; i++) { int nums;//要被插入的号码 int flag;//标志左还是右 1为右 0为左 cin >> nums >> flag; if (flag == 1)//右边 { //1.当前标号的右边等于nums的右边 right[i] = right[nums]; //2.记得将nums的左边的右边变为当前标号 left[right[nums]]= i; //3.再把nums的右边变为当前标号 right[nums] = i; //4.最后把当前标号的left变为nums left[i] = nums; //右边插入完毕 } else { //1.先把当前标号的左边变为nums的左边 left[i] = left[nums]; //2.再把nums左边的右边变为当前标号 right[left[nums]] = i; //3.再把nums的左边变为当前标号 left[nums] = i; //4.再把当前标号的右边变为nums right[i] = nums; //左边插入完毕 } if (left[i] == -1) { index = i;//更新最左边的标号 } } int M; cin >> M;//输入要去掉的人数 for (int i = 0; i < M; i++) { int number; cin >> number;//输入号码 if (IsOut[number])//如果未被去掉过 { IsOut[number] = false;//标记为去掉过 if (left[number] != -1)//如果number左边还有人 { right[left[number]] = right[number];//就把它左边的右边变为它的右边 } if (right[number] != -1)//如果number右边还有人 { left[right[number]] = left[number];//就把它的右边的左边变为它的左边 if (left[right[number]] == -1)index = right[number];//更新最左边的号码 } } } while (right[index] != -1)//循环,如果当前index的右边为-1,则说明他是最后一个人 { cout << index << ' ';//输出当前的人 index = right[index];//把它的右边赋值给index,更新index } cout << index << ' ';//把最后一个人也输出 return 0; } ```
by sana_37 @ 2023-09-25 22:15:34


``` #include<cstdio> using namespace std; int n,m; struct node { int pre,nxt; }a[100010]; void init() { for(int i=1;i<=n;i++) a[i].pre=a[i].nxt=-1; a[1].nxt=-1; a[1].pre=0; a[0].nxt=1; } void insert_left(int pos,int k) { a[a[pos].pre].nxt=k; a[k].pre=a[pos].pre; a[pos].pre=k; a[k].nxt=pos; } void insert_right(int pos,int k) { a[a[pos].nxt].pre=k; a[k].nxt=a[pos].nxt; a[pos].nxt=k; a[k].pre=pos; } void remove(int x) { if(a[x].pre==-1) return; a[a[x].pre].nxt=a[x].nxt; a[a[x].nxt].pre=a[x].pre; a[x].pre=-1; a[x].nxt=-1; } void print() { int start=a[0].nxt; while(1) { printf("%d ",start); if(a[start].nxt==-1) break; start=a[start].nxt; } } int main() { scanf("%d",&n); init(); for(int i=2;i<=n;i++) { int k,p; scanf("%d%d",&k,&p); if(p==1) insert_right(k,i); else insert_left(k,i); } scanf("%d",&m); for(int i=1;i<=m;i++) { int x; scanf("%d",&x); remove(x); } print(); return 0; } ```
by Leo2525 @ 2023-09-27 21:58:56


|