josephus Problem 初级(使用数组)

问题描述:

这是一个很经典的问题,一桌人一起吃饭,比如有6个人,第一个人从1开始报数,后面的人报的数依次递增,当报出的数为某一个数时,报数的那个人出局,游戏继续。出局的那个人后面的还没有出局的人继续从1开始报数,直到所有的人出局为止。得出出局顺序。

比如有6个人,分别为1,2,3,4,5,6 。报数到3的人出局,则出局顺序应该是:3,6, 4, 2, 5, 1

解决方案:

可以采取对数组置标志位解决,将其置为0表示已出局,则遍历到它的时候,不需要增加计数。置标志位在实际开发中也是比较常见的一种思路。

代码:

#include <stdio.h>
/*total people number*/
#define ALL 100
/*people leave when count to left_counter*/
#define left_counter 3
/*people array*/
int people[ALL];

/*init people array*/
void initPeople()
{
	int i = 0 ;
	for (i = 0; i < ALL; i++)
	{
		people[i] = i+1;
	}
}

/*print people array*/
void printPeople()
{
	int i = 0;
	for (i = 0; i < ALL; i++)
	{
		printf("%d ",people[i]);
	}
	printf("\n");
}

int main(void)
{
	initPeople();
	int left = ALL;		/*init total left number*/
	int counter = 0;	/*init counter*/
	int i = 0;		/*init array index*/
	while (1)
	{
		if (0 != people[i])
		{
			counter++;
		}
		/*if counter == left_counter , peopler out, set people[i] = 0
 		  counter = 0;
		  left--;
		**/
		if (counter == left_counter)
		{
			left--;
			printf("%d is out\n", people[i]);
			counter = 0;
			people[i] = 0;
			printPeople();
		}
		/*if no people left, problem solved*/
		if (0 == left)
		{
			printf("problem finished!\n");
			break;
		}
		/*increase index*/
		i++;
		if (i == ALL)
		{
			i = 0;
		}
	}
	return 0;
}
时间: 2024-11-08 22:00:34

josephus Problem 初级(使用数组)的相关文章

josephus Problem 中级(使用数组模拟链表,提升效率)

问题描述: 在<josephus Problem 初级(使用数组)>中,我们提出了一种最简单直接的解决方案. 但是,仔细审视代码之后,发现此种方案的效率并不高,具体体现在,当有人出局时,遍历数组仍需要对其进行判断, 这无疑做了无用功,降低了代码效率,在人数多时尤其明显. 解决方案: 当有人出局时,考虑将当前出局的人的前一个人(未出局)的下一个人置为当前出局的下一个人(未出局).这样,便确保了每次对counter的增加都是有效的,遍历到的人都是还没有出局的.大大提升了程序的效率.这其实运用了链表

Codeforces 459D Pashmak and Parmida&#39;s problem(树状数组)

题目链接:Codeforces 459D Pashmak and Parmida's problem 题目大意:给定一个序列,定义f(l,r,x)为l≤k≤r并且ak=x的k的个数,求1≤i<j≤n的情况下,f(1,i,ai)<f(j,n,aj)的个数. 解题思路:预处理出f(1,i,ai),f(j,n,aj)值,然后用树状数组维护个数. #include <cstdio> #include <cstring> #include <algorithm> us

LightOJ - 1179 Josephus Problem(约瑟夫)

Josephus Problem Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit Status Description The historian Flavius Josephus relates how, in the Romano-Jewish conflict of 67 A.D., the Romans took the town of Jotapata which he w

Codeforcecs 459D Pashmak and Parmida&#39;s problem 树状数组 OR 分治

http://codeforces.com/contest/459/problem/D 题意:定义:f(l,r,x) [l,r]内x的个数 ,n个数,a[i] n<=1e5,a[i]<=1e9 问i<j时满足f(1,i,a[i]) > f(j,n,a[j]) 的(i,j)对数? 预处理出后缀f(j) 插入到BIT中 枚举i,查询mp[a[i]]-1,后更新BIT即可. #include <bits/stdc++.h> using namespace std; typed

Codeforces Round 261 Div.2 D Pashmak and Parmida&#39;s problem --树状数组

题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a[j]),求有多少对这样的(i,j). 解法:分别从左到右,由右到左预处理到某个下标为止有多少个数等于该下标,用map维护. 然后树状数组更新每个f(j,n,a[j]),预处理完毕,接下来,从左往右扫过去,每次从树状数组中删去a[i],因为i != j,i不能用作后面的统计,然后统计getsum(inc[a[i]]-1), (inc表示从左到右),即查询比此时的a[i]

LightOj 1179 Josephus Problem

1179 - Josephus Problem PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB The historian Flavius Josephus relates how, in the Romano-Jewish conflict of 67 A.D., the Romans took the town of Jotapata which he was commanding. Esc

Problem X: 删除数组元素

Problem X: 删除数组元素 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 375  Solved: 151[Submit][Status][Web Board] Description 定义Array类,其中只有一个int类型的数组,数组元素个数未知. 重载其<<.>>.-运算符.其中"<<"输出所有的数组元素,两两之间用1个空格隔开:">>"根据输入的格式读取数

【CF459D】 Pashmak and Parmida&#39;s problem [树状数组]

CF459D Pashmak and Parmida's problem 给出长度为n的序列a. f(i,j,x)表示ai..aj中x的出现次数. 求有多少对i,j满足f(1,i,ai) > f(j,n,aj).(i<j) 害挺水 就是开始计数那用的玄学vector超时了... 用 map/离散化预处理出 f(1, i, a[i]) 和 f(j, n, a[j]) 类似求逆序对,树状数组.维护 #include<bits/stdc++.h> using namespace std;

HDU5008 Boring String Problem(后缀数组 + 二分 + 线段树)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5008 Description In this problem, you are given a string s and q queries. For each query, you should answer that when all distinct substrings of string s were sorted lexicographically, which one is