1.P1996 约瑟夫问题
题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入 #1复制
10 3
输出 #1复制
3 6 9 2 7 1 8 5 10 4
说明/提示
1≤m,n≤100
#include<iostream> #include<queue> using namespace std; int n,m; int main() { queue <int>q; cin>>n>>m; for(int i=1;i<=n;i++) q.push(i); while(q.size()) { //把队头移到队尾 //类似循环队列 //注意是移动m-1次,不是m次 for(int j=1;j<m;j++) { int mov=q.front(); q.pop(); q.push(mov); } //淘汰队头 cout<<q.front()<<" "; q.pop(); } return 0; }2.B3616 【模板】队列
题目描述
请你实现一个队列(queue),支持如下操作:
push(x):向队列中加入一个数 x。pop():将队首弹出。如果此时队列为空,则不进行弹出操作,并输出ERR_CANNOT_POP。query():输出队首元素。如果此时队列为空,则输出ERR_CANNOT_QUERY。size():输出此时队列内元素个数。
输入格式
第一行,一个整数 n,表示操作的次数。
接下来 n 行,每行表示一个操作。格式如下:
1 x,表示将元素x加入队列。2,表示将队首弹出队列。3,表示查询队首。4,表示查询队列内元素个数。
输出格式
输出若干行,对于每个操作,按「题目描述」输出结果。
每条输出之间应当用空行隔开。
输入输出样例
输入 #1复制
13 1 2 3 4 1 233 3 2 3 2 4 3 2 1 144 3
输出 #1复制
2 1 2 233 0 ERR_CANNOT_QUERY ERR_CANNOT_POP 144
说明/提示
样例解释
首先插入2,队首为2、队列内元素个数为1。
插入233,此时队首为2。
弹出队首,此时队首为233。
弹出队首,此时队首为空。
再次尝试弹出队首,由于队列已经为空,此时无法弹出。
插入144,此时队首为144。
数据规模与约定
对于 100% 的测试数据,满足 n≤10000,且被插入队列的所有元素值是 [1,1000000] 以内的正整数。
#include<iostream> using namespace std; const int N=1e5+10; int q[N]; int front,back,size; void Push(int x) { back++; q[back]=x; } int Size() { return back-front; } void Pop() { if(Size()>0) front++; else cout<<"ERR_CANNOT_POP"<<endl; } void Query() { if(Size()>0) cout<<q[front+1]<<endl; else cout<<"ERR_CANNOT_QUERY"<<endl; } int main() { int n; cin>>n; int input=0; while(n--) { cin>>input; if(input==1) { int x; cin>>x; Push(x); } else if(input==2) Pop(); else if(input==3) Query(); else if(input==4) cout<<Size()<<endl; } return 0; }