[C++]白駿1158:ジョセフス問題
#include <iostream>
#include <queue>
using namespace std;
int main(int argc, char **argv){
int N, K, i = 0, cnt = 0;
queue<int> q;
scanf("%d %d",&N,&K);
int * circle = new int[N];
while(q.size() != N){
if(circle[i] != 1) { // 1이면 circle
cnt++;
}
if(cnt == K){
circle[i] = 1;
q.push(i+1);
cnt = 0;
}
i++;
if(i >= N){
i = 0;
}
}
printf("<");
for(int i=0; i<N; i++){ // 큐에 넣고 한번에 출력
if(i == N - 1){
printf("%d", q.front());
} else {
printf("%d, ", q.front());
}
q.pop();
}
printf(">");
return 0;
}
今日のポイント
また非常に非効率的な方法で解決した.書くのは書くが、結果が出たらキューに入れて出力するコードだけ.
理想的には、まずキューにすべての数字を入れ、与えられた数(K)の倍数でなければ、キューから一番前の数を減算して後ろに置く.それでは、K個数を先頭に出力し続けてくださいほうは天才に似てる...!
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main(void) {
int num, data;
queue<int> q;
cin >> num >> data;
cout << "<";
for (int i = 1; i <= num; i++) {
q.push(i);
}
while (!q.empty()) {
for (int j = 0; j < data-1; j++) {
q.push(q.front());
q.pop();
}
cout << q.front();
q.pop();
if (!q.empty())
cout << ", ";
}
cout << ">";
}
出典:https://parkssiss.tistory.com/81[コーデック]Reference
この問題について([C++]白駿1158:ジョセフス問題), 我々は、より多くの情報をここで見つけました https://velog.io/@lamknh/C-백준-1158-요세푸스-문제テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol