[白俊/C++230号:チョイス
5981 ワード
ピックアップ
二重ポインタアルゴリズムを用いた.
ダブルポインタアルゴリズム
1. start = end = 0
2.常にstart<=endを満たす.
start=0,end=0から subがmより小さい場合はend++である. subがmより大きい場合はstart++であり、subがansより小さい場合はans更新である.
これは、逆数の最初の数字から逆数の最初の数字を減算した場合、subよりも小さい場合はないからである.(最後から2番目以降の数字は昇順に並べられています)
1 2 3 5から
3 - 1 = 2
5–1=4.
startを座視する必要はありません.
end1 2 3 4 5
m = 1000
この場合、endは増加し続けるため、配列範囲を超えます.このような状況を避けるために
アイデア
二重ポインタアルゴリズムを用いた.
ダブルポインタアルゴリズム
1. start = end = 0
2.常にstart<=endを満たす.
start=0,end=0から
これは、逆数の最初の数字から逆数の最初の数字を減算した場合、subよりも小さい場合はないからである.(最後から2番目以降の数字は昇順に並べられています)
1 2 3 5から
3 - 1 = 2
5–1=4.
startを座視する必要はありません.
m = 1000
コミットコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
int n, m, ans = 2000000000;
cin >> n >> m;
vector<int> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
sort(v.begin(), v.end());
int start = 0, end = 0;
while (start <= end && end < n)
{
int sub = v[end] - v[start];
if (sub < m) // 답이 아님
end++;
else
{
ans = min(ans, sub);
start++;
}
}
cout << ans;
return 0;
}
Reference
この問題について([白俊/C++230号:チョイス), 我々は、より多くの情報をここで見つけました https://velog.io/@fere1032/백준C2230번-수-고르기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol