n人の学生の得点が与えられる.得点の差の絶対値が最小となる2人を選び,その値を答えよ.
制約: ,
解法1. 全探索
2人の選び方を全通り試す.n人の中から異なる2人を選ぶ方法は 通りとなるので間に合う.
計算時間:
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int n;
while (cin >> n, n) {
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
int ans = abs(a[n - 1] - a[0]);
for (int i = 0; i < n - 1; ++i)
for (int j = i + 1; j < n; ++j)
ans = min(ans, abs(a[j] - a[i]));
cout << ans << '\n';
}
return 0;
}
解法2. ソート
得点の配列を昇順にソートする.番目の人と得点の差の絶対値が最小となる人は 番目か 番目の人となるので,先頭から隣り合う人のみだけを見て探索をする.
計算時間:
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int n;
while (cin >> n, n) {
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
sort(a.begin(), a.end());
int ans = a[n - 1] - a[0];
for (int i = 0; i < n - 1; ++i)
ans = min(ans, a[i + 1] - a[i]);
cout << ans << '\n';
}
return 0;
}
まとめ
ICPC国内予選のA問題はAll okのA(違う)ということで全探索.
想定解法[1]も同じ.