UVA305 Joseph 题解

题目传送门

题目大意

题目描述

2 × k 2 \times k 2×k 个人围成一圈, k k k 个好人站在一起, k k k 个坏人站在一起。

从第 1 1 1 个好人开始报数,接着是第 2 2 2 个好人……好人报完后才轮到坏人。第 1 1 1 个人报 1 1 1,第 2 2 2 个人报 2 2 2……第一个报 m m m 的人淘汰出圈,下一个人又报 1 1 1,再下一个人又报 2 2 2……

现请你求出最小的 m m m,使得坏人都淘汰完后才有好人被淘汰。

解题思路

这道题目是经典的约瑟夫问题,建议先做 P1145

我们假设好人坏人都站成一排,好人的编号为 1 1 1 k k k,坏人的编号为 k + 1 ∼ 2 × k k+1 \sim 2\times k k+12×k

为了使坏人都在好人出局之前出局,所以 m > k m > k m>k,否则不满足题意。那么我们可以暴力枚举 m m m,再求出现在出局的人的编号,如果这个人是好人,那么现在的 m m m 不满足题意,直接跳过本次枚举。否则,就说明我们找到了最小且满足题意的数 m m m

注意:

由于 k < 14 k<14 k<14,而询问次数并未注明,为了以防万一,我们可以先预处理出所有答案,对于每次询问,直接输出即可。

CODE:

#include <iostream>
using namespace std;
int a[20];
int main() {
    for (int k = 1; k < 14; k++) {
    	bool flag = false;
    	int m = k + 1;
    	while (!flag) {
	        int now = 0, i = 0;
	        for (; i <= k; i++) {
	        	if (i == k)
	        		break;
	            now = (now + m - 1) % (2 * k - i);
	            if (now < k)
					break;
	        }
	        if (i == k)
	        	flag = true;
	        else
	        	m++;
    	}
    	a[k] = m;
	}
	int n;
	while (scanf("%d", &n) && n > 0) {
		printf("%d\n", a[n]);
	}
    return 0;
}

总结

这道题目没有什么难度,只需要预处理一下答案即可。

乘积矩阵:
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏
∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ ∏ \prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod\prod ∏∏∏∏∏∏∏∏∏∏∏∏∏∏∏

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值