[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[コーデック]