AtCoder Beginner Contest 016 解説

3,313 views

Published on

AtCoder Beginner Contest 016 解説

Published in: Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,313
On SlideShare
0
From Embeds
0
Number of Embeds
163
Actions
Shares
0
Downloads
16
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

AtCoder Beginner Contest 016 解説

  1. 1. ABC #016解説 解説スライド:水野尚人(not)
  2. 2. 問題A12月6日
  3. 3. 問題概要 月が日で割り切れるかを判定する
  4. 4. 解法 月と日を標準入力から受け取る 割り切れる? YESを出力 NOを出力 NO YES 入出力・条件分岐が必要 練習問題や他の人の解答を参考にして学んでください
  5. 5. 問題BA±B Problem
  6. 6. 問題概要 入出力が与えられるので ・A+Bだとわかる ・A-Bだとわかる ・どちらの可能性もある ・どちらでもない を判定する
  7. 7. 解法 A+B=CかつA-B≠C → A+Bだとわかる A+B≠CかつA-B=C → A-Bだとわかる A+B=CかつA-B=C → どちらの可能性もある A+B≠CかつA-B≠C→ どちらでもない 場合分けを正確に漏れ無くやりましょう
  8. 8. 問題C 友達の友達
  9. 9. 問題概要 SNSの友達関係が与えられるので、 各ユーザの友達の友達の人数を求めよ 要するに、 無向グラフが与えられるので、 各頂点から距離2の頂点がいくつあるか求めよ ユーザ1 ユーザ2 ユーザ3 入力例1のグラフ 頂点 辺
  10. 10. 解法1 ・探索して友達の友達を数える すでに見た友達を記録しておく
  11. 11. 解法2 ・頂点を2つ選んで友達の友達か調べる →共通の友達がいる (かつ、自分自身または友達ではない) 共通の友達
  12. 12. 解法3 ・全頂点間の最短経路を求め、 各頂点から距離2の頂点を数える →ワーシャル-フロイド法や ダイクストラ法などを使いましょう (類題)ABC#012 D問題
  13. 13. 問題D 一刀両断
  14. 14. 問題概要 多角形を線分で切断するといくつに分かれるか 求めよ
  15. 15. 考察 ・分割された多角形を愚直に数えるとたいへん ・何か良い性質はないだろうか?
  16. 16. 考察 分割された多角形の数 =切っている線分(青)の本数+1 もうちょっと考えると…
  17. 17. 考察 分割された多角形の数 =多角形と線分の交点(紫)の数÷2+1 =線分と交差する多角形の辺の本数÷2+1 これなら数えられそう
  18. 18. 解法 辺と線分が交差 →線分同士の交差判定を使う 片方の線分から見て もう一方の線分の端点が左右にある 右 右 左 左
  19. 19. 解法 線分から見た左右の判定方法は? →符号付き面積を使いましょう 公式:푆=(푥1푦2−푥2푦1)/2 + -
  20. 20. 解法 まとめると、 分割された多角形の数 =切っている線分の本数+1 =多角形と線分の交点の数÷2+1 =線分と交差する多角形の辺の本数÷2+1 線分同士の交差判定は符号付き面積を使う

×