在一行中输入三个整数
,用空格隔开。
输出一个整数,表示最后剩下的"大王"编号。
5 1 2
3
初始队列编号为,从编号
开始报数:
出队,剩余
;
出队,剩余
;
出队,剩余
;
出队,剩余
,输出
。
#include <iostream>
using namespace std;
int main() {
int n,k,m; // 人数,开始位置,报数步长
cin>>n>>k>>m;
int a[n]; // 标记是否出列
int count=n;
int cnt,num=k; // num = k,用于标记当前报数人的位置
for(int i=0;i<n;i++){
a[i]=i; // 初始化数组,每个人都有自己的编号
}
cnt=0; // 计数器,当前报数的步数
while (count>=1) { // 还有未出列的人就循环
if(a[num]!=-1) { // 若当前报数人未出列
cnt++; // 则报数计数器+1,表示有人报数
if(cnt==m) { // 若数到了m!
a[num]=-1; // 当前人出列
count--; // 剩余人数--
cnt=0; // 报数计数归零!
}
}
if(num==n) num=1; //假设转了一圈,则从头开始再来
else num++; //
}
cout<<num-1<<endl;
} #include <iostream>
using namespace std;
#include <list>
#include <iterator>
int main() {
int n,k,m;
cin >> n >> k >> m;
list<int> lst;
int count = 0;
for(int i = 0; i < n; ++i)
{
lst.push_back(i);
}
list<int>::iterator curr = lst.begin();
advance(curr, k);
while(lst.size() > 1)
{
++count;
if(count == m)
{
curr = lst.erase(curr);
if(curr == lst.end()) {curr = lst.begin();}
count = 0;
}
else
{
++curr;
if(curr == lst.end()) {curr = lst.begin();}
}
}
cout << *lst.begin() << endl;
}
#include <stdio.h>
int main()
{
int n, k, m;
scanf("%d %d %d", &n, &k, &m);
int arr[n],a=0,p=k;//arr[]s数组标记0出队,a标记出队人数,p标记当前未出队的首个报数编号
for(int i=0;i<n;i++) arr[i] = 1;
while(n-1-a)
{
for(int j=0;j<m-1;j++)
{
do{
if(++p==n) p=0;
}while(!arr[p]);//找出出队编号
}
arr[p]=0;
a++;
do{
if(++p==n) p=0;
}while(!arr[p]);//找出出队后下个首个报数编号
}
printf("%d\n",p);
return 0;
} #include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k, m;
cin >> n >> k >> m;
vector<int> circle(n, 0); // 0表示还在队列中
int count = n; // 剩余人数
int current = k; // 当前报数位置
while (count > 1) {
// 报数m次
int step = 0;
while (step < m) {
// 如果当前人还在队列中,算一次报数
if (circle[current] == 0) {
step++;
if (step == m) break; // 报到m了
}
current = (current + 1) % n; // 移动到下一个人(循环)
}
// 当前人出队
circle[current] = 1;
count--;
// 找到下一个开始报数的人(下一个还在队列中的人)
while (circle[current] == 1) {
current = (current + 1) % n;
}
}
// 找到最后剩下的人
for (int i = 0; i < n; i++) {
if (circle[i] == 0) {
cout << i << endl;
break;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main() {
// 定义核心变量:n=总人数,k=报数初始起点,m=报数淘汰数
int n, k, m;
cin >> n >> k >> m;
int a[105] = {0}; // 淘汰状态数组:0=未淘汰,1=已淘汰
int cnt = 0; // 淘汰人数计数器
int i = k;
int t = 0; // 报数模拟,在i处报出的数字
while (cnt != n - 1) {
if (i > n - 1) {
i = 0;
}
if (a[i] == 0) {
t++;
if (t == m) {
a[i] = 1;
cnt++;
t = 0;
}
}
i++;
}
for (int i = 0; i < n; i++) {
if (a[i] == 0) {
cout << i;
}
}
return 0;
} import java.util.*;
public class Main{
public static void main(String[] args){
int n,k,m;
Scanner in = new Scanner(System.in);
n = in.nextInt();
k = in.nextInt();
m = in.nextInt();
List<Integer> list = new ArrayList<>();
for(int i=0;i<n;i++)list.add(i);
while(true){
if(list.size()==1)break;
if(k+m-1>list.size()-1){
int len = list.size();
list.remove((k+m-1)%list.size());
k = (k+m-1)%len;
}else{
list.remove(k+m-1);
k = k+m-1;
}
}
System.out.println(list.get(0));
}
} #include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false) ;
cin.tie(nullptr) ;
cout.tie(nullptr) ;
int n , k , m ;
cin >> n >> k >> m ;
bool* jsf = new bool[n]() ;
int kill = 0 , cnt = 0 ;
for (int i = k ; kill < n-1 ; i = (i+1)%n) {
if (!jsf[i]) {
cnt++ ;
}
if (cnt==m) {
jsf[i] = true ;
cnt = 0 ;
kill++;
}
}
for (int i = 0 ; i<n ; ++i) {
if (!jsf[i]) {cout << i ;break ;}
}
delete [] jsf ;
return 0 ;
} #include <stdio.h>
int main() {
int n, k, m;
if (scanf("%d %d %d", &n, &k, &m) != 3 || n < 2 || n > 100 || k < 0 || k >= n || m < 1 || m > 100) {
return 1;
}
int N[n], t = m - 1;
for (int i = 0; i < n; i += 1) {
N[i] = i;
}
while (n > 1) {
k = (k + t) % n;
n -= 1;
for (int i = k; i < n; i += 1) {
N[i] = N[i + 1];
}
}
printf("%d", *N);
return 0;
}