前回に続きNim解説となります。
A03 - Two Cards
今回は2つの配列から1つずつ値をとって、合計値k
となる値があるかの判定を行う問題です。
2重ループの問題ですね。
ソースコードの全文
import std/strutils import std/sequtils proca03() = let line0 = stdin.readLine().split().mapIt(it.parseInt()) n = line0[0] k = line0[1] ps = stdin.readLine().split()[0..<n].mapIt(it.parseInt()) qs = stdin.readLine().split()[0..<n].mapIt(it.parseInt()) var flg: bool = falsefor p in ps: for q in qs: if (p + q) == k: flg = truebreakif flg: echo"Yes"else: echo"No" a03()
ソースコードの解説
- ライブラリのインポートと標準入力からのデータ取り込みについては割愛。
- A01とA02のブログ記事参照して下さい。
二重ループ
- 本問題の肝は以下の二重ループ。
- 判定したいのは合計値が
k
となるp
とq
の組み合わせがあるか
だけですので、存在確認したらbreak
します。
var flg: bool = falsefor p in ps: for q in qs: if (p + q) == k: flg = truebreak
flg
というブール変数を初期化します。ps
の各要素p
とqs
の各要素q
のペアを全てチェックし、その和がk
に等しいかどうかを確認します。- 和が
k
に等しいペアが見つかるとflg
をtrue
に設定し、内側のループを抜けます。
結果の出力
if flg: echo"Yes"else: echo"No"
flg
がtrue
なら"Yes"
を出力し、false
なら"No"
を出力します。flg
がtrue
の場合は "Yes" を出力し、false
の場合は "No" を出力します。
プロシージャの呼び出し
a03()
a03
プロシージャを呼び出して実行します。
プログラムの動作
- 最初に標準入力から1行読み取り、空白で区切られた2つの整数
n
とk
を取得します。 - 次に、
n
個の整数のリストps
とqs
を標準入力から読み取ります。 ps
の各要素とqs
の各要素のペアを調べ、その和がk
と等しいペアが存在するかをチェックします。- 和が
k
となるペアが見つかれば"Yes"
, 見つからなければ"No"
を出力します。