uva 133 The Dole Queue 双向约瑟夫环 模拟实现

本文探讨了双向约瑟夫环问题,并提供了一种通过模拟实现的解决方案。重点介绍了如何在环形数组中从两个相反的方向寻找指定步长的元素,并在找到后将它们同时移除。此外,还分享了在Uva在线评测系统中遇到的一些输出格式陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双向约瑟夫环。

数据规模只有20,模拟掉了。(其实公式我还是不太会推,有空得看看)

值得注意的是两个方向找值不是找到一个去掉一个,而是找到后同时去掉。

还有输出也很坑爹!

在这里不得不抱怨下Uva的oj,少了个s,少了个空行什么的都不会显示pe,就给个wa,让人还以为算法有问题。原本以为Uva没有pe,然后据说这边的输出空行如果不对的话就会显示pe。。。


代码:

#include <cstdio>
#include <cstring>
const int maxn = 22;

int N;
bool d[maxn];

int cw(int pos, int k) {
	int cnt = 0;
	for ( ; cnt != k; pos++) {
		if (pos == N) pos = 0;
		if (d[pos]) cnt++;
	}
	return --pos;
}

int w(int pos, int m) {
	int cnt = 0;
	for (; cnt != m; pos--) {
		if (pos == -1) pos = N - 1;
		if (d[pos]) cnt++;
	}
	return ++pos;
}
int main() {
	int k, m;
	while (scanf("%d%d%d", &N, &k, &m) && N && k && m) {
		memset(d, 1, N);
		int tot = N, flag = 0, a = 0, b = N - 1;
		while (tot) {
			a = cw(a, k), b = w(b, m);
			tot--;
			if (flag) printf(",");
			d[a] = d[b] = false;
			flag = 1;
			if (a == b)
				printf("%3d", a + 1);
			else {
				printf("%3d%3d", a + 1, b + 1);
				tot--;
			}
		}//while find out all
		printf("\n");
	}//while
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值