取号系统
2023-10-22 12:09:42
发布于:北京
#include<iostream>
using namespace std;
//定义数组最大长度 
const int MAXN = 100010;
//定义循环队列数组a 
int a[MAXN];
//定义结果数组 
int result[MAXN];
int main()
{
	//K:纸牌张数,N:人数,P:每次向底部放置的牌数 
	int K, N, P;
	//定义队首为a[1],舍弃a[0] 
	int front = 1;
	cin >> N >> K >> P;
	//队尾为a[K] 
	int rear = K;
	//将牌的大小存入相应的数组元素中 
	for (int i = 1; i <= K; i++)a[i] = i;
	// 小明在N的整数倍时得到自己的牌,x用来计数 
	int x = 0;
	//从最小的牌到最大的牌循环遍历 
	for (int i = 1; i <= K; i++)
	{
		//每发一个人x++ 
		x++;	
		//如果发到小明,则将当前队首元素存入结果数组中,桶排序方法 
		if (x % N == 0)result[a[front]] = a[front];
		//每次发完牌后,舍弃掉 
		a[front] = NULL;
		//指向下一张牌 
		front = (front + 1) % MAXN;
		//如果队首元素等于队尾元素加1,代表队空,与上面的定义有点不一样 
		if (front == rear + 1)break;
		//循环将P张牌放到队尾 
		for (int j = 1; j <= P; j++)
		{
			//队尾+1 
			rear = (rear + 1) % MAXN;
			//将队首的放入队尾 
			a[rear] = a[front];
			//队首清空 
			a[front] = NULL;
			//队首后移 
			front = (front + 1) % MAXN;
		}
	}
	//打印输出,桶排序方法 
	for (int i = 1; i <= K; i++) { if(result[i])cout << result[i] << endl; }
	return 0;
}
这里空空如也






有帮助,赞一个