見出し画像

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の練習をしておくと良いと思います。

この記事が気に入ったらサポートをしてみませんか?