josephus Problem 中级(使用数组模拟链表,提升效率)
问题描写叙述:
在《josephus Problem 0基础(使用数组)》中。我们提出了一种最简单直接的解决方式。
可是,细致审视代码之后。发现此种方案的效率并不高,详细体如今。当有人出局时,遍历数组仍须要对其进行推断,
这无疑做了无用功。减少了代码效率。在人数多时尤其明显。
解决方式:
当有人出局时,考虑将当前出局的人的前一个人(未出局)的下一个人置为当前出局的下一个人(未出局)。
这样,便确保了每次对counter的添加都是有效的。遍历到的人都是还没有出局的。大大提升了程序的效率。这事实上运用了链表的思想。
代码:
#include <stdio.h>
/*total people number*/
#define ALL 100
/*people leave when count to left_counter*/
#define left_counter 3
/*next Array record the next people's position*/
int next[ALL]; /*init next array*/
void initNext()
{
int i = 0 ;
for (i = 0; i < ALL; i++)
{
next[i] = (i+1) % ALL;
}
} /*print next array*/
void printNext()
{
int i = 0;
for (i = 0; i < ALL; i++)
{
printf("%d ", next[i]);
}
printf("\n");
} int main(void)
{
initNext();
int left = ALL; /*init total left number*/
int counter = 0; /*init counter*/
int i = 0; /*init array index*/
int prev = All-1; /*init prev*/
while (left > 0)
{
counter++;
/*if counter == left_counter , people out, set next[prev] = next[i]
counter = 0
left--
**/
if (counter == left_counter)
{
left--;
printf("%d is out\n", i+1);
counter = 0;
next[prev] = next[i];
printNext();
} /*change prev, increase index*/
prev = i;
i = next[i]; }
printf("problem finished!\n");
return 0;
}
josephus Problem 中级(使用数组模拟链表,提升效率)的更多相关文章
- UVA11988-Broken Keyboard(数组模拟链表)
Problem UVA11988-Broken Keyboard Accept: 5642 Submit: 34937 Time Limit: 1000 mSec Problem Descripti ...
- B - Broken Keyboard (a.k.a. Beiju Text) 数组模拟链表
You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...
- C - Boxes in a Line 数组模拟链表
You have n boxes in a line on the table numbered 1 . . . n from left to right. Your task is to simul ...
- PAT 甲级 1052 Linked List Sorting (25 分)(数组模拟链表,没注意到不一定所有节点都在链表里)
1052 Linked List Sorting (25 分) A linked list consists of a series of structures, which are not ne ...
- UVa12657 - Boxes in a Line(数组模拟链表)
题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y ...
- 天梯赛 L2-022. (数组模拟链表) 重排链表
题目链接 题目描述 给定一个单链表 L1→L2→...→Ln-1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln-1→L2→....例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2 ...
- CSUOJ 1329 一行盒子(数组模拟链表)
题目:id=1329">http://acm.csu.edu.cn/OnlineJudge/problem.php? id=1329 题意: watermark/2/text/aHR0 ...
- UVa 11988 Broken Keyboard(数组模拟链表)
题目链接: https://cn.vjudge.net/problem/UVA-11988 /* 问题 将一段文本经过一定的规则处理后输出,规则就是[表示home键,表示光标跳到行首,]表示end键, ...
- UVa 11988 (数组模拟链表) Broken Keyboard (a.k.a. Beiju Text)
题意: 模拟一个文本编辑器,可以输入字母数字下划线,如果遇到'['则认为是Home键,如果是']'则认作End键. 问最终屏幕上显示的结果是什么字符串. 分析: 如果在数组用大量的移动字符必然很耗时. ...
随机推荐
- Android中EditText样式修改 聚焦光标、背景
在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的.这两天,在项目中涉及此需求,现记录如下: 首 ...
- 十年学会编程 著者: Peter Norvig 翻译: Dai Yuwen
为何人人都这么着急? 信步走进任何一家书店,你会看到名为<如何在7天内学会Java>的书,还有各 种各样类似的书: 在几天内或几小时内学会Visual Basic, Windows, In ...
- C#之Action
Action<T> 委托 class Program { static void Main(string[] args) { MyDelegate<string>(MyFunc ...
- [MSSQL2012]First_Value函数
First_Value返回结果集中某列第一条数据的值,跟TOP 1效果一样,比较简单的一个函数 先贴测试用代码 DECLARE @TestData TABLE( ID INT IDENTITY ...
- php后台开发(二)Laravel框架
php后台开发(二)Laravel框架 为了提高后台的开发效率,往往需要选择一套适合自己的开发框架,因此,选择了功能比较完善的Laravel框架,仔细学来,感觉和Python语言的框架Django非常 ...
- 剑指offer 面试题6:重建二叉树
重建二叉树 题目 输入某二叉树的前序遍历和中序遍历,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含有重复的数字. 例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{ ...
- [JS9] document's bgColor改变背景颜色
<HTML> <HEAD> <TITLE>设置背景颜色</TITLE> </HEAD> <BODY> <CENTER> ...
- atitit.web原理 理论attilax总结
atitit.web原理 理论attilax总结 1. Web3.01 2. Web的未来趋势1 3. Web语言与应用导论_百度百科.html2 4. <Web设计与编程导论(影印版)> ...
- atitit.ajax bp dwr 3.的注解方式配置使用流程总结.....
atitit.ajax bp dwr 3.的注解方式配置使用流程总结..... 1. 下载 dwr.jar 1M 1 2. 配置注解方式..web.xml 1 3. Class 配置 2 4. 测试 ...
- Essential C++中文版 前言
天啊,这本书竟是如此轻薄短小.我真想大叫一声“哇欧”!C++ Primer 加上索引.扉页.谢词之后,厚达1237 页,而此书却只有薄薄276 页.套句拳击术语,这是一部“轻量级”作品. 每个人都会好 ...