`
scott________
  • 浏览: 20870 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
社区版块
存档分类
最新评论

poj 1012 Joseph

阅读更多

    题目描述:poj.org/problem?id=1012
   
    经典Joseph 问题的加强版, 参见注释, 注释很详细.
#include <cstdio>

/* 
 测试m是否满足要求
 k: 有2k个人
 m:每数到m就出局 */
bool test(int k, int m) {
	int i = 0, len = 2 * k; //len: 当前总人数
	while(len > k) {
		i = (i + m - 1) % len;  //每次出局人是出局前的len 个人中的第i 个, 下标从0 开始
		if(i < k)	
			return false;
		len--;  //没出局一个,修改len
	}
	return true;
}

int main() {
	int k;
	int a[14] = {0};	//数组保存计算过的数据, 不保存的话会超时,
						//其实很无聊,就14个数据,还整这么大的数据量
	while(scanf("%d", &k) && k) {
		 if(!a[k]) {	//如果a[k]为0 就进行测试
			int t = k + 1;  //测试从k+1开始,下于K+1的测试没必要
			while(true) {
				if(test(k, t)) {
					a[k] = t;
					break;
				}
				else
					t++;
				if(t == 2 * k)//跳过不必要的测试
					t += k + 1;
			}
		}
		printf("%d\n", a[k]);
	}
	return 0;
}


    还有"猥琐"点的做法,因为就 14个数据, 直接把数据存到数组中即可

#include <cstdio>
int main() {
	int k,a[15]= {0, 2, 7, 5, 30, 169, 441, 1872, 7632, 1740, 93313, 459901, 1358657, 2504881, 14};
	while(scanf("%d", &k), k)
		printf("%d\n", a[k]);
	return 0;
}

   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics