题目不难,属于模拟类型的题目,需要比较仔细地处理各种边界情况。估计题目的本意是想让我们实现一个双向循环链表,我看了下N的值最大20,所以想先用数组实现试试,基本思路也是在数组里双向循环,删除的元素标记下;双向循环链表实现就比较好理解了,但是实现起来有些麻烦,指针神马的很容易搞错,需要非常仔细。
开始提交超时了,原因分析了下是因为:虽然N的值不大,但是k和m可以很大,所以找下k/m个的时候需要mod一下当前queue的size。
数组实现:
#include<stdio.h> #define MAX 30 /* * status 0 means normal, status 1 means deleted * */ typedef struct Node { int num; int status; } Node; /* * startIdx1,startIdx2 mark the starting point of each round of picking. * */ typedef struct Queue { Node elements[MAX]; int size; int startIdx1; int startIdx2; } Queue; int n, k, m; Queue queue; void printQue() { int i; for (i = 0; i < n; i++) { printf("%d:[%d,%d] ", i, queue.elements[i].num, queue.elements[i].status); } printf("size:%d\n", queue.size); } int getNextIdx(int current) { int result = current + 1; if (result == n) result = 0; return result; } int getPreIdx(int current) { int result = current - 1; if (result < 0) result = n - 1; return result; } int pickFirst(int idx) { int currentIdx = idx; int count = 1; int num = k % queue.size; if (num == 1 || (queue.size == 1)) return currentIdx; if (num == 0) num = queue.size; while (1) { currentIdx = getNextIdx(currentIdx); if (queue.elements[currentIdx].status != 1) count++; if (count == num) { return currentIdx; } } } int pickSecond(int idx) { int currentIdx = idx; int count = 1; int num = m % queue.size; if (num == 1 || (queue.size == 1)) return currentIdx; if (num == 0) num = queue.size; while (1) { currentIdx = getPreIdx(currentIdx); if (queue.elements[currentIdx].status != 1) count++; if (count == num) { return currentIdx; } } return 0; } void pick() { int firstPick = pickFirst(queue.startIdx1); int secondPick = pickSecond(queue.startIdx2); queue.elements[firstPick].status = 1; queue.elements[secondPick].status = 1; if (firstPick == secondPick) queue.size -= 1; else queue.size -= 2; if (firstPick != secondPick) printf("%3d%3d", queue.elements[firstPick].num, queue.elements[secondPick].num); else printf("%3d", queue.elements[firstPick].num); if (queue.size > 0) printf(","); else printf("\n"); if (queue.size <= 0) return; int nextStartIdx1 = getNextIdx(firstPick); while (queue.elements[nextStartIdx1].status == 1) nextStartIdx1 = getNextIdx(nextStartIdx1); int nextStartIdx2 = getPreIdx(secondPick); while (queue.elements[nextStartIdx2].status == 1) nextStartIdx2 = getPreIdx(nextStartIdx2); queue.startIdx1 = nextStartIdx1; queue.startIdx2 = nextStartIdx2; } int main() { /* setbuf(stdout,NULL);*/ while (scanf("%d%d%d", &n, &k, &m) != EOF) { if (n == 0) break; queue.size = n; queue.startIdx1 = 0; queue.startIdx2 = n - 1; int i; for (i = 0; i < n; i++) { queue.elements[i].num = i + 1; queue.elements[i].status = 0; } while (queue.size > 0) { pick(); } } return 0; }
链表实现:
#include<stdio.h> #include<stdlib.h> #define MAX 30 struct Node; typedef struct Node* PtrToNode; typedef struct Node { int num; PtrToNode next; PtrToNode pre; } Node; typedef struct Queue { PtrToNode head; int size; PtrToNode startIdx1; PtrToNode startIdx2; } Queue; int n, k, m; Queue queue; Queue *que = &queue; void printQueue() { int i; PtrToNode cur = que->head; for (i = 0; i < que->size; i++) { printf("%d ", cur->num); cur = cur->next; } printf("size:%d,idx1:%d,idx2:%d", que->size, que->startIdx1->num, que->startIdx2->num); printf("\n"); } void makeQueue() { PtrToNode head = (PtrToNode) malloc(sizeof(Node)); head->num = 1; head->next = head; head->pre = head; que->head = head; que->size = n; que->startIdx1 = head; que->startIdx2 = head; if (n == 1) return; PtrToNode pre = head; int i; for (i = 1; i < n; i++) { PtrToNode current = (PtrToNode) malloc(sizeof(Node)); current->num = i + 1; current->pre = pre; pre->next = current; if (i == n - 1) { current->next = head; head->pre = current; } pre = current; } que->startIdx1 = head; que->startIdx2 = head->pre; } PtrToNode getNextNNode(PtrToNode p, int n) { int i; int size = n % que->size; PtrToNode result = p; for (i = 0; i < size; i++) { result = result->next; } return result; } PtrToNode getPreNNode(PtrToNode p, int n) { int i; int size = n % que->size; PtrToNode result = p; for (i = 0; i < size; i++) { result = result->pre; } return result; } /* * type 0 means removing the first pick. * type 1 means removing the second pick. * type 2 means removing the same item when first pick equals second pick. * * */ int removeNode(PtrToNode p, int type) { if (p == NULL ) return -1; int num = p->num; if (p == que->head) que->head = p->next; if (p == que->startIdx1) que->startIdx1 = p->next; if (p == que->startIdx2) que->startIdx2 = p->pre; if (type == 2) { que->startIdx1 = p->next; que->startIdx2 = p->pre; } else if (type == 0) { que->startIdx1 = p->next; } else { que->startIdx2 = p->pre; } p->pre->next = p->next; p->next->pre = p->pre; free(p); que->size--; return num; } void pick() { PtrToNode first = getNextNNode(que->startIdx1, k - 1); PtrToNode second = getPreNNode(que->startIdx2, m - 1); int one, two; if (first == second) { one = two = removeNode(first, 2); } else { one = removeNode(first, 0); two = removeNode(second, 1); } if (one != two) printf("%3d%3d", one, two); else printf("%3d", one); if (que->size > 0) printf(","); else printf("\n"); } int main() { /* setbuf(stdout,NULL);*/ while(scanf("%d%d%d",&n,&k,&m)!=EOF) { if(n==0) break; makeQueue(); while(que->size>0) { pick(); } } return 0; }
相关推荐
《UVA133 - 救济金发放问题:The Dole Queue》 在计算机科学领域,算法是解决问题的关键工具,特别是在处理复杂数据结构和优化问题时。UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战...
常用1.SchLib
# 【tokenizers-***.jar***文档.zip】 中包含: ***文档:【tokenizers-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【tokenizers-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【tokenizers-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【tokenizers-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【tokenizers-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: tokenizers-***.jar***文档.zip,java,tokenizers-***.jar,ai.djl.huggingface,tokenizers,***,ai.djl.engine.rust,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,djl,huggingface,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【tokenizers-***.jar***文档.zip】,再解压其中的 【tokenizers-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>ai.djl.huggingface</groupId> <artifactId>tokenizers</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'ai.djl.huggingface', name: 'tokenizers', version: '***' Gradle (Short): implementation 'ai.djl.huggingface:tokenizers:***' Gradle (Kotlin): implementation("ai.djl.huggingface:tokenizers:***") ``` # 含有的 Java package(包): ``` ai.djl.engine.rust ai.djl.engine.rust.zoo ai.djl.huggingface.tokenizers ai.djl.huggingface.tokenizers.jni ai.djl.huggingface.translator ai.djl.huggingface.zoo ``` # 含有的 Java class(类): ``` ai.djl.engine.rust.RsEngine ai.djl.engine.rust.RsEngineProvider ai.djl.engine.rust.RsModel ai.djl.engine.rust.RsNDArray ai.djl.engine.rust.RsNDArrayEx ai.djl.engine.rust.RsNDArrayIndexer ai.djl.engine.rust.RsNDManager ai.djl.engine.rust.RsSymbolBlock ai.djl.engine.rust.RustLibrary ai.djl.engine.rust.zoo.RsModelZoo ai.djl.engine.rust.zoo.RsZooProvider ai.djl.huggingface.tokenizers.Encoding ai.djl.huggingface.tokenizers.HuggingFaceTokenizer ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.Builder ai.djl.hu
内容概要:本文详细探讨了电力系统中PMU(相量测量单元)的优化配置问题,旨在确保系统完全可观测的同时尽量减少PMU的数量。作者介绍了六种不同的算法,包括模拟退火、图论方法、递归安全N算法等,并通过MATLAB实现了这些算法。通过对IEEE标准测试系统的实验,展示了各种算法在不同规模系统中的表现。文中不仅提供了具体的MATLAB代码实现,还分享了许多实用的经验技巧,如邻域解生成、退火速率设置、拓扑排序等。 适合人群:从事电力系统研究的技术人员、研究生以及对组合优化感兴趣的科研工作者。 使用场景及目标:适用于电力系统状态估计、故障诊断等领域,帮助研究人员和工程师找到最优的PMU配置方案,提高系统的可靠性和经济性。 其他说明:文章强调了在实际应用中需要注意的问题,如变压器支路的影响、节点编号不连续等问题,并推荐了几篇相关领域的经典文献供进一步学习。此外,还提到了一些有趣的发现,如某些中间节点装PMU反而能减少总数。
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了三菱FX1s PLC与台达MS300变频器通过Modbus RTU协议实现通讯的方法。首先,文中列举了所需的硬件设备及其连接方法,确保PLC与变频器能够正常通信。接下来,针对频率设定、频率读取及正反转启停控制三大主要功能进行了详细的编程讲解,提供了具体的梯形图代码示例并解释了每一步的作用。此外,还涉及到了触摸屏(MCGS和威纶通)的配置步骤,使用户可以通过触摸屏方便地操作变频器的各项功能。最后,作者分享了一些实用的小技巧和常见错误避免方法,帮助使用者快速解决问题,提高工作效率。 适合人群:从事自动化控制系统集成的技术人员,尤其是那些需要将三菱PLC与台达变频器进行互联的工程师。 使用场景及目标:适用于工业自动化领域的项目实施过程中,旨在帮助技术人员掌握三菱FX1s与台达MS300变频器之间的高效通信技术,从而更好地完成系统集成任务。 其他说明:文中不仅包含了详细的理论知识和技术要点,还有丰富的实践经验分享,有助于读者全面理解和应用相关技术。同时,提供的完整工程文件可以直接应用于实际项目中,极大地节省了开发时间和成本。
winrar免费版压缩工具
内容概要:本文详细介绍了灰狼算法(GWO)、鲸鱼算法(WOA)和人工蜂群算法(ABC)在CEC21标准测试函数集上的性能对比。通过设定相同的实验条件(种群数量50,迭代次数500次,30维问题空间),分别探讨了各算法的关键参数调整及其对不同类型函数(单峰、多峰、复合)的影响。文中提供了每个算法的核心代码片段,并针对具体函数给出了优化建议。最终结果显示,GWO在单峰函数上有优势,WOA擅长处理旋转和平移问题,而ABC在高维复杂环境中表现出色。 适合人群:从事优化算法研究的科研人员、研究生以及对智能优化算法感兴趣的开发者。 使用场景及目标:适用于需要评估和比较不同优化算法性能的研究项目,特别是那些涉及高维、多峰、旋转平移等问题的实际应用场景。目标是帮助研究人员选择最适合特定任务的优化算法,并提供参数调优的经验。 其他说明:文章不仅提供了理论分析,还分享了许多实践经验,如参数调整技巧、初始化方法等。此外,所有实验均基于Matlab平台完成,附带完整的代码实现,方便读者复现实验结果。
电控开关.SchLib
# 【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【spring-ai-autoconfigure-model-openai-1.0.0-M7-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-autoconfigure-model-openai-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-autoconfigure-model-openai-1.0.0-M7.jar中文-英文对照文档.zip,java,spring-ai-autoconfigure-model-openai-1.0.0-M7.jar,org.springframework.ai,spring-ai-autoconfigure-model-openai,1.0.0-M7,org.springframework.ai.model.openai.autoconfigure,jar包,Maven,第三方jar包,组件,开源组件,第三方
c++复习题.doc
本科毕业设计(论文)中期检查报告
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
weixin248食堂订餐小程序ssm(文档+源码)_kaic
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
e1e90185ca2f1eda312e7f604d38195c_b4125f83523abcb38acd9dc0deebd500
# 【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【spring-ai-autoconfigure-mcp-client-1.0.0-M7-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-autoconfigure-mcp-client-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar中文-英文对照文档.zip,java,spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar,org.springframework.ai,spring-ai-autoconfigure-mcp-client,1.0.0-M7,org.springframework.ai.mcp.client.autoconfigure,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springfram
该项目使用 OpenCV 实现图像中红色目标的识别与轮廓框选,适用于图像处理、颜色追踪与形状检测等场景。项目无需深度学习框架,适合图像识别技术入门学习。附带测试图像与运行说明,支持一键运行。
爱威6-8电脑调音软件是专为音响爱好者和专业人士设计的一款强大工具,喜欢的话,直接下载吧
# 【spring-ai-vertex-ai-0.8.0.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【spring-ai-vertex-ai-0.8.0-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【spring-ai-vertex-ai-0.8.0.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-vertex-ai-0.8.0.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-vertex-ai-0.8.0.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-vertex-ai-0.8.0-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-vertex-ai-0.8.0.jar中文-英文对照文档.zip,java,spring-ai-vertex-ai-0.8.0.jar,org.springframework.ai,spring-ai-vertex-ai,0.8.0,org.springframework.ai.vertex,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springframework,spring,ai,vertex,中文-英文对照API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【spring-ai-vertex-ai-0.8.0.jar中文-英文对照文档.zip】,再解压其中的 【spring-ai-vertex-ai-0.8.0-javadoc-API文档-中文(简体)-英语-对照版.zip】,双