1012:Joseph

网址如下:

OpenJudge - 1012:Joseph

其中一个解法

只想到了一个快速找到下一位处决的人的方法,本质上还是遍历,暂时没想到更优的方法了

代码如下:

#include<cstdio>
int k;

bool judge(int tt, int m, int r){
	if(tt == k) return true;
	int num = (m - r) % tt; num = num ? num : tt;
	if(num <= k) return false;
	return judge(tt - 1, m, tt - num);
}

int main(void)
{
	while(scanf("%d", &k) && k){
		for(int m = 1; ; m++)
			if(judge(k * 2, m, 0)){printf("%d\n", m); break;}
	}

	return 0;
}

快速找到下一个处决的人的方法

从我的代码可以看出来,用了一个递归函数进行判断该m行不行,因为k小于13,所以递归层数最多到14个,不用担心栈堆段内存爆炸

先说说各个变量代表的意义:

tt:剩下的总人数

m:和题目的m一样

r:在上次处决之后,处决的人的后面的坏人数(到第一个好人出现为止)

num:这次要处决的编号

简单来说就是保持队列的第一个是编号为1的好人,这样就可以直接取余得出要处决的人的编号,只需注意一下刚好整除的情况就行了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值