取号系统
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;
}
这里空空如也
有帮助,赞一个