ABC201 A 解答
A - Tiny Arithmetic Sequence(12)
問題
問題文
長さ 3 の数列 A = ( A1, A2, A3 )が与えられます。
A を適切に並び替えて等差数列にすることはできますか?
即ち、A3−A2 = A2−A1を満たすように A を並び替えることはできますか?
制約
1 ≤ Ai ≤100
入力は全て整数
考察
長さ3の数列を並べ替えて条件を満たすかどうかを判定します。
様々実装の方法があると思いますが、ここでは問題文に与えられてる方法を2つ試してみます。キーワードとしては
1)等差数列
2)A3−A2 = A2−A1
この2つです。やってることは一緒ですが実装の方法を変えてみる感じです。
まずは1)の等差数列です。等差数列かどうかを判定するためには数列をソートしてあげるのが簡単です。小さい順でも大きい順でもよいので並び替えましょう。C++ですと、vector Vに対して
sort(V.begin(), V.end());
とすると、小さい順に並んでくれます。そのあと、隣の数字との差が等しくなればよいので、
V[2] - V[1] == V[1] - V[0]
で判定ができます。これでOKです。
2)A3−A2 = A2−A1です。
A問題はfor文とかsortなどを使わないで解ける問題になっているらしいので、使わず解きます。
各数字をA1, A2, A3に割り当てる方法は全部で6通りありますので、全部書きだしましょう。
A1 - A2 == A2 - A3
A1 - A3 == A3 - A2
A2 - A3 == A3 - A1
A2 - A1 == A1 - A3
A3 - A2 == A2 - A1
A3 - A1 == A1 - A2
このなかの一つでも成立してくれればOKです。
本記事では1)の方法を実装しています。
実装
#include <bits/stdc++.h> #define rep(i,n) for(int i=0;i<n;++i) #define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
int main()
{
vector<int> a(3);
rep(i, 3) cin >> a[i];
sort(a.begin(), a.end());
if (a[2] - a[1] == a[1] - a[0]) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
あとがき
等差数列の問題でした。全部書きだすことで答えは求まりますが、速く正確にACするためにソートする方法を採用するのが良さそうです。
次の問題になりますがABC201のB問題はソートをすることで答えが求まりますので、そのためにsortの練習をしておくと良いと思います。
この記事が気に入ったらサポートをしてみませんか?