[白俊/C+]1377号:気泡セット
📁 質問する
https://www.acmicpc.net/problem/1377
💭 最初のプール(タイムアウト)
#include <iostream>
using namespace std;
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int N;
cin >> N;
int* A = new int[N];
for (int k = 1; k < N+1; k++) {
cin >> A[k];
}
bool changed = false;
for (int i = 1; i <= N + 1; i++) {
changed = false;
for (int j = 1; j <= N - i; j++) {
if (A[j] > A[j + 1]) {
changed = true;
swap(A[j], A[j + 1]);
}
}
if (changed == false) {
cout << i << '\n';
break;
}
}
return 0;
}
Bubbleソートで問題を解決し、タイムアウトを発見しました.別の方法で近づくべきだと思います.
例えば、入力値が1015.23の場合
![例](
また、第3段階では移動していないため、発泡ソートは第3段階で終了する.
したがって,左側に向かって押す値がどれだけ左側に向かって押されたかが分かれば,気泡の位置合わせの回数を知ることができる.
すなわち,左側に押し込まれた回数が最も多かったのがバブルソートの発生回数であった.
🤍 成功!
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<pair<int, int>> v;
int val;
for (int idx = 0; idx < n; idx++) {
cin >> val;
v.push_back(pair<int, int>(val,idx));
}
sort(v.begin(), v.end());
int r = 0;
for (int i = 0; i < n; i++) {
if (v[i].second - i > r) {
r = v[i].second - i;
}
}
cout << r + 1 << '\n';
return 0;
}
❗Vector見た目が簡単なので見間違えやすく、結局タイムアウトになってしまい、本当に慌ただしくて・・・😱
そうですね.こんなに簡単にはできません.最初は泡のソートにすっかり惹かれていたので、他の方法を考え出すのは難しいです.ほほほ
また,実現アルゴリズムは容易であるが,c++を熟知していないため,ソースコードで実現することは困難である.
📚 参考になるブログ
Reference
この問題について([白俊/C+]1377号:気泡セット), 我々は、より多くの情報をここで見つけました https://velog.io/@heeyunkwon/백준C-1377번-버블-소트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol