A05 - Three Cards¶
- created: 2022-12-26 mon
- ご意見・ご要望はissue・プルリク用のGitHubまで
- 競技プログラミングのためのF#入門
- GitHub上の対応ディレクトリ
- 公式ページ
- 要点: アルゴリズム, ループを減らす
入出力¶
1 2 | |
方針¶
これもよく出てくる処理です. 単純に三重ループを回すとTLEで時間内に終わりません. 時間内に終わらせる工夫が必要です.
解説¶
単純な処理の累積¶
三つ目のループをどうにかして回避する必要があります. 発想を転換して二つ目までのループで次のような和を作りましょう.
1 | |
この配列はN^2個の要素を持っています. 仮に三つ目のループを回すとしてその変数をxとすると, x = K-i-jが所定の範囲である1からNにおさまっていれば条件をみたします. そこでfilterを使ってチェックしましょう.
1 2 | |
これで条件をみたす要素だけが抜き出せました. あとはこの配列の長さを取れば終わりです.
1 2 3 | |
forの中でフィルターする¶
他の言語と同じくforの内包表記の中で次のようにフィルターできます.
1 | |
あとは同じく配列の長さを取れば終わりです.
1 2 | |
filterでN^2個の配列を再びチェックしなくていい分, こちらの方が二割ほど速いです.