当前位置: 首页 > news >正文

洛谷 P1160 队列安排

首先,这个题目有一个天然的条件,就是插入的顺序是和编号顺序是一致的,那么要想做到一直对应,而且想要随时访问,那么用数组又是一个很好的选择,但是,这个顺序删来删去,逻辑结构肯定不会是像数组一样连续的,同时呢,题目很明确的表示了:此题目有插入操作,同时也有删除操作,且还会分前后之别,所以很容易就要想到:双向链表+数组来做这道题。

以队列中其中一个人为研究对象,整合一下我们需要的信息:

1.前面的同学;

2.后面的同学;

3.我出队列了吗?(这会决定删人的时候该不该忽略)

4.我的编号?

则链表结点结构体安排:

typedef struct listnode { bool stillthere;//判定是不是离开了 struct listnode* left; struct listnode* right; int num;//编号 }node;

接下来就是双向链表的删除,插入操作,很好想,思路不是很难,但是,边界情况一定一定要记得先讨论!

全部代码:

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> typedef struct listnode { bool stillthere;//判定是不是离开了 struct listnode* left; struct listnode* right; int num;//编号 }node; node* buynode(int x) { node* newnode = (node*)malloc(sizeof(node)); if (newnode == NULL) { perror("malloc fail!"); exit(1); } newnode->stillthere = true; newnode->num = x; newnode->left = NULL; newnode->right = NULL; return newnode; } int main() { int n; while (scanf("%d", &n) != EOF) { node* student[100001]; student[1] = buynode(1); for (int i = 2; i <= n; i++) { student[i] = buynode(i); int lor = 1; int beinsertednum = 0; scanf("%d %d", &beinsertednum, &lor); if (lor == 1) { if (student[beinsertednum]->right == NULL) { student[i]->right = NULL; student[i]->left = student[beinsertednum]; student[beinsertednum]->right = student[i]; } else { student[i]->right = student[beinsertednum]->right; student[beinsertednum]->right->left = student[i]; student[i]->left = student[beinsertednum]; student[beinsertednum]->right = student[i]; } } else { if (student[beinsertednum]->left == NULL) { student[i]->left = NULL; student[i]->right = student[beinsertednum]; student[beinsertednum]->left = student[i]; } else { student[i]->left = student[beinsertednum]->left; student[beinsertednum]->left->right = student[i]; student[i]->right = student[beinsertednum]; student[beinsertednum]->left = student[i]; } //目前没啥问题,但是怕就怕在特殊情况,如头插,上一个就比如说尾插,很难受,要处理一下. } } int m = 0; scanf("%d", &m); for (int i = 0; i < m; i++) { int x; scanf("%d", &x); //依然是remember处理特殊的边界情况 if (student[x]->stillthere == true) { node* rs = student[x]->right; node* ls = student[x]->left; if (rs == NULL && ls != NULL) { ls->right = NULL; student[x]->stillthere = false; } else if (ls == NULL && rs != NULL) { rs->left = NULL; student[x]->stillthere = false; } else if (ls == NULL && rs == NULL) { printf(" \n"); } else { ls->right = rs; rs->left = ls; student[x]->stillthere = false; //今后工作了之后要free掉这个student[i] } } } int cur=0; for (int i = 1; i <= n; i++) { if (student[i]->stillthere == true) { cur = i; break; } } node* pcur = student[cur]; while (pcur->left != NULL) { pcur = pcur->left; } while (pcur != NULL) { printf("%d ", pcur->num); pcur = pcur->right; } printf("\n"); } return 0; }
http://www.jsqmd.com/news/482952/

相关文章:

  • MCP客户端状态同步加密传输失效真相:从TLS 1.2降级到国密SM4动态协商的全链路加固实践
  • LangChain开发-全量记忆方案:完整保存与检索对话历史
  • Phi-3-vision-128k-instruct快速验证:10分钟完成部署+首张图问答全流程
  • 学术文献获取难题?这款开源工具让科研效率提升300%
  • GME-Qwen2-VL-2B开源大模型效果展示:中文古籍插图→文言文释义语义检索
  • 立创开源ESP32精灵球收音机硬件改造:MAX97220音频增强与网络收音机适配实战
  • LobeChat文件上传功能:支持PDF、Excel解析,变身智能办公助手
  • Python实战:用statsmodels轻松绘制PACF图,快速判断AR模型阶数
  • 4步解锁Mac专业音效:eqMac均衡器从入门到精通
  • 嵌入式开发者必备:SSCom跨平台串口调试工具完全指南
  • AI视频增强技术突破:告别模糊视频的终极方案
  • Scarab:革新性空洞骑士模组管理一站式解决方案
  • douyin-downloader:破解视频获取难题的全栈解决方案
  • ABAQUS多面体骨料与纤维混合插件:源代码大揭秘
  • Spring_couplet_generation 性能监控:搭建基础监控体系保障服务健康
  • 告别环境配置烦恼:WinPython便携开发环境全攻略
  • 用 ZOA - BiLSTM 实现多变量时间序列超前24步回归预测
  • RyzenAdj深度解析:AMD锐龙处理器性能调控技术指南
  • Qwen3-14b_int4_awq从零部署教程:vLLM服务验证+Chainlit前端调用全步骤
  • 海景美女图-一丹一世界FLUX.1效果展示:flowing summer dress海风动态感生成
  • MCP状态同步延迟超500ms?对比12款主流插件实现方案,仅2款通过严格时序一致性测试(附JMeter压测报告)
  • 【STATA】高效处理缺失值:foreach与replace的批量操作技巧
  • Qwen3-14b_int4_awq效果对比:vLLM与TGI在Qwen3-14b_int4_awq上的推理性能横评
  • Qwen3-14b_int4_awq实战案例:用Chainlit构建跨境电商多语言商品描述生成器
  • MusePublic Art Studio快速部署:阿里云PAI-EAS一键部署SDXL艺术工坊教程
  • HSTracker:macOS炉石传说高效工具实战指南
  • Phi-3-vision-128k-instruct完整指南:从镜像拉取、服务启动到前端交互
  • 手把手教你用AI Trae+Vue3+Golang打造私人文件分享系统(附避坑指南)
  • JavaWeb_07
  • 合并单元格