The Dole Queue UVA - 133

本文介绍了一个基于C++实现的官员位置模拟算法,通过顺时针和逆时针移动指定步数来更新官员的位置,最终输出所有官员的淘汰顺序。算法涉及数组操作、循环和条件判断等基本编程概念。

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

觉得主要还是开始的时候,两个官员的位置吧,要往前挪一位

#include <iostream>
#include <cstring>

using namespace std;

int n, k, m, a[25];

int go(int official, int d, int t);  // 官员official,d表示顺逆时针(-1表顺时针,1表逆时针),t表示走几步

int main() {
	while ((cin >> n >> k >> m).good() && n) {
		memset(a, 0, sizeof(a));
		for (int i = 1; i <= n; i++)
			a[i] = i;
		int length = n;  // 还剩下的人数
		int official1 = n, official2 = 1;  // 第一个官员的位置,第二个官员的位置,因为第一个人也记录在内,所以往相应位置挪一位
		while (length) {
			official1 = go(official1, 1, k);
			official2 = go(official2, -1, m);
			printf("%3d", official1);
			length--;
			if (official1 != official2) {
				printf("%3d", official2);
				length--;
			}
			a[official1] = a[official2] = 0;
			if (length)
				putchar(',');
		}
		putchar('\n');
	}
	return 0;
}

int go(int official, int d, int t) {
	while (t--) {
		do {
			if (official + d == n + 1)  // 当逆时针到末尾时,重新开始循环
				official = 1;
			else if (official + d == 0)  // 当顺时针到末尾时,重新开始循环
				official = n;
			else
				official += d;
		}
		while (a[official] == 0);  // 如果遇到0,则继续循环
	}
	return official;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值