回転キュー(1021)

1966 ワード

中に入ると


これは、円形キューから必要な要素を抽出する問題です.
Dequeを使用して、左または右に回転し、一番前に目的の要素が現れたらcountを停止して出力します.

コードの説明


彼は自分で左と右の移動方法と移動の基準を探している.しかし、インデックスは見つかりませんでした.どんな方法で解くか、どんな要素を使うかは知っていますが、コードで完成するのはまだ足りないと思います.解き続けると慣れますか.
1.まずnとmを受け入れる.
2.n Dequeに入れます.
検索するインデックスを配列に挿入します.
4.合計mを回転し、dequeを先に回転し、インデックスと同じ値があるかどうかを見つけます.つまり、私たちが探している数字です.同じ値がある場合は、別の変数として保存します.
5.数字がDequeサイズの半分以下の場合は、左に回転します.左に曲がるたびにcountを追加します.値が見つかったらpop forntにします.
6.条件でなければ右に曲がります.ここの繰り返し文はDequeですsize()-インデックス.私はここで間違いを犯しました.サイズでインデックスを外しますが、右に曲がります.そして、値段が見つかればpop frontをあげます.
7.完全な複文が完了したらcountを出力します.

コード#コード#

#include<deque>
#include<iostream>
using namespace std;

int main() {
	//기본 정보
	int n, m, x;
	int index = 0;
	int count = 0;
	deque<int> dq;
	int arr[51];

	cin >> n >> m;

	//dq에 값 넣기
	for (int i = 1; i <= n; i++) {
		dq.push_back(i);
	}

	//찾고자하는 데이터 인덱스 받기
	for (int i = 0; i < m; i++) {
		cin >> x;
		arr[i] = x;
	}

	for (int i = 0; i < m; i++) {

		for (int j = 0; j < n; j++) {
			if (dq.at(j) == arr[i]) {
				index = j;
				break;
			}
		}

		if (index <= dq.size() / 2) {
			for (int k = 0; k < index; k++) {
				dq.push_back(dq.front());
				dq.pop_front();
				count++;
			}
			dq.pop_front();
		}
		else {
			for (int k = 0; k < dq.size() - index; k++) {
				dq.push_front(dq.back());
				dq.pop_back();
				count++;
			}
			dq.pop_front();
		}
	}

	cout << count << endl;
}