SlideShare a Scribd company logo
1 of 40
Download to read offline
AtCoder Beginner Contest 026
解説
AtCoder株式会社 代表取締役
高橋 直大
2015/7/11 1
競技プログラミングを始める前に
• 競技プログラミングをやったことがない人へ
– まずはこっちのスライドを見よう!
– http://www.slideshare.net/chokudai/abc004
2015/7/11 2
©AtCoder Inc. All rights reserved. 3
A問題 掛け算の最大値
2015/7/11 3
A問題 問題概要
• 偶数Aが与えられる。
• X + Y = AとなるX,Yのうち、X×Yが最大になるものを
選び、その値を出力せよ
• 制約
• 2 ≦ A ≦ 100
2015/7/11 4
A問題 アルゴリズム
• 基本的なプログラムの流れ
– 標準入力から、必要な入力を受け取る
• 今回の場合は、 A という1つの整数
– 問題で与えられた処理を行う
• 今回は、X*Yの最大化
– 標準出力へ、答えを出力する
2015/7/11 5
A問題 アルゴリズム
• 入力
– 1つの文字列を、標準入力から受け取る
• Cであれば、scanf(“%d”, &A); など
• C++であれば、cin >> A;
• 入力の受け取り方は、下記の練習問題に記載があります。
– http://practice.contest.atcoder.jp/tasks/practice_1
2015/7/11 6
A問題 アルゴリズム
• 今回の問題は、X*Yの最大値を出力する
• X*Yが最大となるX,Yってどう求めればいいの?
– よくわからない場合は全通り調べれば良い!
– ループを回して、全通り調べましょう。
– 例えばこんな感じ
for(int X = 0; X <= A; X++){
int Y = A – X:
ans = max(ans, X * Y);
}
2015/7/11 7
A問題 アルゴリズム
• 実は、相加相乗平均より、X = Y = A / 2の時、X*Yが
最大となることがわかる
• それが解っていれば、その1通りだけ調べれば良い
int X = A / 2;
int ans = X * X;
2015/7/11 8
A問題 アルゴリズム
• 出力
– 求めた答えを、標準出力より出力する。
– 言語によって違います。
• printf(“%d¥n”, ans); (C)
• cout << ans << endl; (C++)
• System.out.println(ans); (Java)
• 各言語の標準出力は、下記の練習問題に記載があります。
– http://practice.contest.atcoder.jp/tasks/practice_1
2015/7/11 9
©AtCoder Inc. All rights reserved. 10
B問題 N重丸
1. 問題概要
2. アルゴリズム
2015/7/11 10
B問題 問題概要
• N個の円が与えられる。これらの円はすべて中心が
原点であり、半径が違う
• 外側から赤白交互に色を塗っていく
• 赤く塗られた部分の面積を求めなさい
• 制約
• 1 ≦ N ≦ 1,000
• 1 ≦ Ri ≦ 1,000
2015/7/11 11
B問題 アルゴリズム
• 入力
– 整数Nを受け取る
– 各円の半径Riをn個受け取る
• 今回はスペース区切りではなく、改行区切りなので、何度も受け
取るだけ
• 詳しくはpracticeで確認しよう!
– http://practice.contest.atcoder.jp/tasks/practice_1
2015/7/11 12
B問題 アルゴリズム
• 処理
– 色を塗られた部分の面積を求めなければならない
2015/7/11 13
B問題 アルゴリズム
• 処理
– 色を塗られた部分の面積を求めなければならない
– まず、最初は何も塗られていない状態
2015/7/11 14
B問題 アルゴリズム
• 処理
– 色を塗られた部分の面積を求めなければならない
– まず、最初は何も塗られていない状態
– そこから、まず一番外側の円を赤く塗る
2015/7/11 15
B問題 アルゴリズム
• 処理
– 色を塗られた部分の面積を求めなければならない
– そこから、まず一番外側の円を赤く塗る
– 次に、2番目の円を白く塗る
2015/7/11 16
B問題 アルゴリズム
• 処理
– 色を塗られた部分の面積を求めなければならない
– そこから、まず一番外側の円を赤く塗る
– 次に、2番目の円を白く塗る
– これを繰り返すことで、全ての色を塗ることが出来る
2015/7/11 17
B問題 アルゴリズム
• 処理
– 色を塗られた部分の面積を求めなければならない
– そこから、まず一番外側の円を赤く塗る
– 次に、2番目の円を白く塗る
– これを繰り返すことで、全ての色を塗ることが出来る
– では、どう計算すればいいか?
• 赤く塗る、の部分で、塗った面積を足す
• 白く塗る、の部分で、塗った面積を引く
– 上記を繰り返すことにより、赤い部分の面積を求めること
が出来る
2015/7/11 18
B問題 アルゴリズム
• 解法まとめ
– まずはRiの値を大きい順にソートする
• ソートアルゴリズムは、大体の言語で標準で実装されている
• 普通は昇順(小さい順)にソートされるので注意
– 小さい順に処理をすると混乱しやすいが、別にできなくはない
– 次に、外側の円から順番に、面積を計算していく
• 赤・白が交互に出てくることに注意
• 円の面積は、(半径)×(半径)×(円周率)
• 円周率は、3.14じゃダメ!標準で入っている言語が多いです。
– 入っていない場合は、調べて十分な精度までコードに埋め込みま
しょう。
– 最後に回答を出力
2015/7/11 19
B問題 アルゴリズム
• 出力
– 今回は、小数を出力する必要がある
– 小数の出力方法も、言語によって違う
• 練習ページには書いていないので、ほかの人の提出を見よう!
– 普通に出力すると、様々な問題があります。
• 桁数が大きいときに、指数表示で出力されてしまう
• 値が小さい時に、十分な精度の出力が行われない
– 以上のようなことを避けるため、出力フォーマットを明記し
ましょう。
• C/C++なら、printf(“%.14f¥n”, ans);など
2015/7/11 20
©AtCoder Inc. All rights reserved. 21
C問題 高橋君の給料
1. 問題概要
2. アルゴリズム
2015/7/11 21
C問題 問題概要
• 社員がN人いる
• 社長以外の社員は、上司を一人だけ持っている
• 社員の給料は、直属の部下の給料の最大値・最小
値から算出できる
• 社長の給料を求めよ
• 制約
• 1 ≦ N ≦ 20
2015/7/11 22
C問題 アルゴリズム
• やるべきことは、問題文に書かれている処理を忠実
に書くだけ
– その書き方が難しい!
• どうして難しいか?
– 自分の給料を決めるのは、「部下の給料」を知る必要が
あるのに、「部下の一覧」は入力で与えられない
• 「部下の一覧」ではなく「上司」が与えられる
– 高橋君の給料を求めようと思っても、まず部下の給料を
求めないといけない!
• 計算順序とかをちゃんと考えないといけない
• 部下がいない時だけ計算式が違う
2015/7/11 23
C問題 アルゴリズム
• 気付くべきこと
– 上司の番号は、必ず自分の番号より小さい
• つまり、部下の番号は、必ず自分の番号より大きい
• 自分より大きい社員番号の社員を、全部調べることにより、自分
の給料を算出できる
• つまり、社員番号の大きい社員から順番に、給料を求めれば良
い
– 上司の番号が与えられているなら、それを適当に処理す
れば、部下の一覧も作れる
• ListやVectorなどの配列を使うことで、適当に対応できる!
2015/7/11 24
C問題 アルゴリズム
• 実装方法
– 実装1:ループによる実装(もらう型)
– 実装2:ループによる実装(配る側)
– 実装3:再帰による実装
2015/7/11 25
C問題 アルゴリズム
• 実装1:ループによる実装(もらう型)
– 予め部下リストを作る
– 逆順に、部下リストから最大値と最小値を求め、給料を求めて
いく
for(int i = N - 1; i >= 0; i--){
if(sub[i].size()==0){P[i] = 1; continue;}
maxP[i] = 0; minP[i] = (int)1e9;
for(int j: sub[i]){
maxP[i] = max(maxP[i], P[j]);
minP[i] = min(minP[i], P[j]);
}
P[i] = maxP[i] + minP[i] + 1;
}
2015/7/11 26
C問題 アルゴリズム
• 実装2:ループによる実装(配る型)
– 逆順に処理していく
– 上司の最大値と最小値を更新し、、給料を求めていく
for(int i = 0; i < N; i++){maxP[i] = 0; minP[i] = (int)1e9;}
for(int i = N - 1; i >= 0; i--){
if(maxP[i]==0) P[i] = 1;
else P[i] = maxP[i] + minP[i] + 1;
maxP[boss[i]] = max(maxP[boss[i]], P[j]);
minP[boss[i]] = min(minP[boss[i]], P[j]);
}
2015/7/11 27
C問題 アルゴリズム
• 再帰による実装
– 部下リストを予め作る
– 再帰で更新する
int dfs(int id){
if(sub[id].size() == 0) return 1;
int minP = (int)1e9; int maxP = 0;
for(int i: sub[id]){
int P = dfs(i);
minP = min(minP, P);
maxP = max(maxP, P);
}
}
2015/7/11 28
C問題 アルゴリズム
• おまけ 部下リストの作り方
– boss[i]が、iの上司がboss[i]であることを示す
– 上司の部下リストに自分を追加する、ということを繰り返
すことで作れる
– 擬似コードは↓のような感じ
List<int> sub[N];
for(int i=0;i<N;i++){
sub[boss[i]].add(i);
}
2015/7/11 29
C問題 アルゴリズム
• 考察
– 「答えが非常に大きくなる」というが、どれくらいか?
• 1の部下が2, 2の部下が3…というような構造になってる時が、最も
大きくなる
• この時、2^n – 1が高橋君の給料になる。
– 今回の問題だと、1048575とかなので、int型で十分
– 計算量も気にしないで良い
• 紹介したどの実装でもO(N)、かつNが20以下なので余裕
• 1億を超えるようなときだけ気を付けよう!
2015/7/11 30
©AtCoder Inc. All rights reserved. 31
D問題 高橋君ボール1号
1. 問題概要
2. アルゴリズム
2015/7/11 31
D問題 問題概要
• 高橋君が、高橋君ボールを投げる
• 投げた時間に対する距離f(t)は、以下の数式で表せ
る
– f(t) = At + Bsin(Ctπ)
• f(t) = 100となるtを1つ求めよ
• 制約
– 1 ≦ A,B,C ≦100
2015/7/11 32
D問題 アルゴリズム
• そもそもどんな関数なのかな?
– 二つに分けて考えよう!
• At
– tに対してAだけ増加する直線
• Bsin(Ctπ)
– 周期2/CのsinカーブをB倍したもの
– つまり、「直線」と「sinカーブ」を足し合わせた関数
– f(t)=100を、数学的に直接求めようとするのは難しそう!
• であれば、何か工夫して求めてみよう!
2015/7/11 33
D問題 アルゴリズム
• 関数のイメージ
– 大体こんな感じ!
• うねうねしながら増えてく
2015/7/11 34
D問題 アルゴリズム
• 直接答えを求められないときはどうすれば良いか?
– 二分探索を使えば良い!
• f(t)のtに、適当な値を入れる
– f(t)が100より大きければtはそれより小さく、100より小さければ、tは
それより大きいことを利用する
• 具体的なアルゴリズム
– 答えがt=0からt=10000の間にあるとする
– ちょうど真ん中のt=5000を試す
– f(t)<100なら、答えは5000から10000の間にあり、そうでないなら、0
から5000の間を調べれば良い
– これを繰り返し、十分な精度になるまで答えを半分にしていく
• これで本当に良い?
– 関数が単調増加な関数でないので、これでは、f(t)=100のtの最小値
などは求められない
– しかし、f(t)=100となる、tの1つを求めるだけなら、これで十分!
2015/7/11 35
D問題 アルゴリズム
• なぜ二分探索で答えが求められるのか?
– 例えば、f(t)=100がこの黒い線だったとする
• 解となるtは、最低1つはあり、図のようにたくさんある場合もある
2015/7/11 36
D問題 アルゴリズム
• なぜ二分探索で答えが求められるのか?
– 例えば、f(t)=100がこの黒い線だったとする
• 解となるtは、最低1つはあり、図のようにたくさんある場合もある
– 今、青い線の間に答えがある、というところまで絞れてお
り、緑の線の間に答えがあることが解っているとする
• どちらを取っても解の取りこぼしが起こる?
– 取りこぼしは発生するが、
左の範囲を選択した時に、
絶対に解の1つが間にある事が
保証される!
2015/7/11 37
D問題 アルゴリズム
• なぜ解が必ずあるか?
– この関数f(t)は、tに対して連続である
– f(左青)≦100≦f(緑)の時、f(t)は連続であるので、左青と
緑の間に、必ずf(t)=100となるtが存在する!
• 中間値の定理
2015/7/11 38
D問題 アルゴリズム
• 擬似コードはおおよそこんな感じ
– t≧200であれば、f(t)≧100は簡単に示せる
double low = 0; high = 200;
for(int i=0;i<100;i++){
double mid = (low+high)/2;
if(f(t)<100) low = mid;
else high = mid;
}
print(low);
2015/7/11 39
D問題 アルゴリズム
• 注意点
– 誤差が非常に厳しいので気を付けましょう!
• f(t)の誤差が10^-6まで許される
– tが10^-9程度変わると、f(t)は10^-5くらい変わったりする
– よって、10^-11程度の精度はあった方が安心
– 二分探索の打ち切り条件に気を付けよう!
– 出力桁数にも注意しよう!
2015/7/11 40

More Related Content

What's hot

AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Inc.
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Inc.
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説AtCoder Inc.
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Inc.
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Inc.
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Inc.
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Inc.
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Inc.
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Inc.
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 

What's hot (20)

AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説AtCoder Beginner Contest 028 解説
AtCoder Beginner Contest 028 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説AtCoder Beginner Contest 004 解説
AtCoder Beginner Contest 004 解説
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
Abc009
Abc009Abc009
Abc009
 
abc027
abc027abc027
abc027
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説AtCoder Beginner Contest 003 解説
AtCoder Beginner Contest 003 解説
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
Arc041
Arc041Arc041
Arc041
 
AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説AtCoder Beginner Contest 007 解説
AtCoder Beginner Contest 007 解説
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 

Similar to AtCoder Beginner Contest 026 解説

AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Inc.
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Inc.
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説AtCoder Inc.
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Inc.
 
8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)bc_rikko
 
Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13OWL.learn
 
JavaScriptのオブジェクト:Mathオブジェクト、Dateオブジェクト
JavaScriptのオブジェクト:Mathオブジェクト、DateオブジェクトJavaScriptのオブジェクト:Mathオブジェクト、Dateオブジェクト
JavaScriptのオブジェクト:Mathオブジェクト、DateオブジェクトYossy Taka
 
応用情報・午後・ストラテジ系を解く(H26春)
応用情報・午後・ストラテジ系を解く(H26春)応用情報・午後・ストラテジ系を解く(H26春)
応用情報・午後・ストラテジ系を解く(H26春)higher_tomorrow
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQLkeki3
 
Operations research yonezawa_no1
Operations research yonezawa_no1Operations research yonezawa_no1
Operations research yonezawa_no1ssuser0bebd2
 
規模の見積もり WACATE 2016 winter
規模の見積もり WACATE 2016 winter 規模の見積もり WACATE 2016 winter
規模の見積もり WACATE 2016 winter Tomoaki Fukura
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
設計時の見落とし
設計時の見落とし設計時の見落とし
設計時の見落としyaju88
 
RでKaggleの登竜門に挑戦
RでKaggleの登竜門に挑戦RでKaggleの登竜門に挑戦
RでKaggleの登竜門に挑戦幹雄 小川
 

Similar to AtCoder Beginner Contest 026 解説 (20)

AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説AtCoder Regular Contest 032 解説
AtCoder Regular Contest 032 解説
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説AtCoder Beginner Contest 019 解説
AtCoder Beginner Contest 019 解説
 
8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)8_C言語入門 - 条件分岐について(if-else if-else)
8_C言語入門 - 条件分岐について(if-else if-else)
 
Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13
 
ABC001 解説
ABC001 解説ABC001 解説
ABC001 解説
 
JavaScriptのオブジェクト:Mathオブジェクト、Dateオブジェクト
JavaScriptのオブジェクト:Mathオブジェクト、DateオブジェクトJavaScriptのオブジェクト:Mathオブジェクト、Dateオブジェクト
JavaScriptのオブジェクト:Mathオブジェクト、Dateオブジェクト
 
応用情報・午後・ストラテジ系を解く(H26春)
応用情報・午後・ストラテジ系を解く(H26春)応用情報・午後・ストラテジ系を解く(H26春)
応用情報・午後・ストラテジ系を解く(H26春)
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
abc031
abc031abc031
abc031
 
2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL2019年度若手技術者向け講座 実践SQL
2019年度若手技術者向け講座 実践SQL
 
Operations research yonezawa_no1
Operations research yonezawa_no1Operations research yonezawa_no1
Operations research yonezawa_no1
 
規模の見積もり WACATE 2016 winter
規模の見積もり WACATE 2016 winter 規模の見積もり WACATE 2016 winter
規模の見積もり WACATE 2016 winter
 
Lt会01_uetch
Lt会01_uetchLt会01_uetch
Lt会01_uetch
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
設計時の見落とし
設計時の見落とし設計時の見落とし
設計時の見落とし
 
RでKaggleの登竜門に挑戦
RでKaggleの登竜門に挑戦RでKaggleの登竜門に挑戦
RでKaggleの登竜門に挑戦
 

More from AtCoder Inc.

AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2AtCoder Inc.
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説AtCoder Inc.
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001AtCoder Inc.
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder Inc.
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説AtCoder Inc.
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Inc.
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Inc.
 

More from AtCoder Inc. (20)

TCO2017R1
TCO2017R1TCO2017R1
TCO2017R1
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
Square869120 contest #2
Square869120 contest #2Square869120 contest #2
Square869120 contest #2
 
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
 
Chokudai Contest 001
Chokudai Contest 001Chokudai Contest 001
Chokudai Contest 001
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
arc047
arc047arc047
arc047
 
abc032
abc032abc032
abc032
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 解説
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
 
CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説CODE FESTIVAL 2015 予選A 解説
CODE FESTIVAL 2015 予選A 解説
 
AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説AtCoder Regular Contest 044 解説
AtCoder Regular Contest 044 解説
 
天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説天下一プログラマーコンテスト2015 予選B 解説
天下一プログラマーコンテスト2015 予選B 解説
 
AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説AtCoder Regular Contest 043 解説
AtCoder Regular Contest 043 解説
 

Recently uploaded

リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slidessusere0a682
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」inspirehighstaff03
 
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」inspirehighstaff03
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」inspirehighstaff03
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfinspirehighstaff03
 
International Politics I - Lecture 1
International Politics I - Lecture 1International Politics I - Lecture 1
International Politics I - Lecture 1Toru Oga
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」inspirehighstaff03
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」inspirehighstaff03
 
Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfEstablishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfoganekyokoi
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」inspirehighstaff03
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfDivorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfoganekyokoi
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」inspirehighstaff03
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」inspirehighstaff03
 
What I did before opening my business..pdf
What I did before opening my business..pdfWhat I did before opening my business..pdf
What I did before opening my business..pdfoganekyokoi
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」inspirehighstaff03
 

Recently uploaded (20)

リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
【ゲーム理論入門】ChatGPTが作成した ゲーム理論の問題を解く #3 Slide
 
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」My Inspire High Award 2024「他者と自分、対立を防ぐには?」
My Inspire High Award 2024「他者と自分、対立を防ぐには?」
 
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
My Inspire High Award 2024「世の中の流行はどのようにして生まれるのか」
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」My Inspire High Award 2024 「本当の『悪者』って何?」
My Inspire High Award 2024 「本当の『悪者』って何?」
 
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdfMy Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
My Inspire High Award 2024「Yakushima Islandってなんか変じゃない?」.pdf
 
International Politics I - Lecture 1
International Politics I - Lecture 1International Politics I - Lecture 1
International Politics I - Lecture 1
 
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」My Inspire High Award 2024「なぜ議会への関心が低いのか?」
My Inspire High Award 2024「なぜ議会への関心が低いのか?」
 
My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」My Inspire High Award 2024  「正義って存在するの?」
My Inspire High Award 2024  「正義って存在するの?」
 
Establishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdfEstablishment and operation of medical corporations.pdf
Establishment and operation of medical corporations.pdf
 
My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」My Inspire High Award 2024      「家族とは何か」
My Inspire High Award 2024      「家族とは何か」
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
Divorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdfDivorce agreements in administrative work.pdf
Divorce agreements in administrative work.pdf
 
My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」My Inspire High Award 2024    「孤独は敵なのか?」
My Inspire High Award 2024    「孤独は敵なのか?」
 
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
My Inspire High Award2024「外国人が日本のテーブルマナーに驚く理由は?」
 
What I did before opening my business..pdf
What I did before opening my business..pdfWhat I did before opening my business..pdf
What I did before opening my business..pdf
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
My Inspire High Award 2024「スーパーマーケットで回収されたキャベツ外葉は廃棄されているの?」
 

AtCoder Beginner Contest 026 解説

  • 1. AtCoder Beginner Contest 026 解説 AtCoder株式会社 代表取締役 高橋 直大 2015/7/11 1
  • 3. ©AtCoder Inc. All rights reserved. 3 A問題 掛け算の最大値 2015/7/11 3
  • 4. A問題 問題概要 • 偶数Aが与えられる。 • X + Y = AとなるX,Yのうち、X×Yが最大になるものを 選び、その値を出力せよ • 制約 • 2 ≦ A ≦ 100 2015/7/11 4
  • 5. A問題 アルゴリズム • 基本的なプログラムの流れ – 標準入力から、必要な入力を受け取る • 今回の場合は、 A という1つの整数 – 問題で与えられた処理を行う • 今回は、X*Yの最大化 – 標準出力へ、答えを出力する 2015/7/11 5
  • 6. A問題 アルゴリズム • 入力 – 1つの文字列を、標準入力から受け取る • Cであれば、scanf(“%d”, &A); など • C++であれば、cin >> A; • 入力の受け取り方は、下記の練習問題に記載があります。 – http://practice.contest.atcoder.jp/tasks/practice_1 2015/7/11 6
  • 7. A問題 アルゴリズム • 今回の問題は、X*Yの最大値を出力する • X*Yが最大となるX,Yってどう求めればいいの? – よくわからない場合は全通り調べれば良い! – ループを回して、全通り調べましょう。 – 例えばこんな感じ for(int X = 0; X <= A; X++){ int Y = A – X: ans = max(ans, X * Y); } 2015/7/11 7
  • 8. A問題 アルゴリズム • 実は、相加相乗平均より、X = Y = A / 2の時、X*Yが 最大となることがわかる • それが解っていれば、その1通りだけ調べれば良い int X = A / 2; int ans = X * X; 2015/7/11 8
  • 9. A問題 アルゴリズム • 出力 – 求めた答えを、標準出力より出力する。 – 言語によって違います。 • printf(“%d¥n”, ans); (C) • cout << ans << endl; (C++) • System.out.println(ans); (Java) • 各言語の標準出力は、下記の練習問題に記載があります。 – http://practice.contest.atcoder.jp/tasks/practice_1 2015/7/11 9
  • 10. ©AtCoder Inc. All rights reserved. 10 B問題 N重丸 1. 問題概要 2. アルゴリズム 2015/7/11 10
  • 11. B問題 問題概要 • N個の円が与えられる。これらの円はすべて中心が 原点であり、半径が違う • 外側から赤白交互に色を塗っていく • 赤く塗られた部分の面積を求めなさい • 制約 • 1 ≦ N ≦ 1,000 • 1 ≦ Ri ≦ 1,000 2015/7/11 11
  • 12. B問題 アルゴリズム • 入力 – 整数Nを受け取る – 各円の半径Riをn個受け取る • 今回はスペース区切りではなく、改行区切りなので、何度も受け 取るだけ • 詳しくはpracticeで確認しよう! – http://practice.contest.atcoder.jp/tasks/practice_1 2015/7/11 12
  • 13. B問題 アルゴリズム • 処理 – 色を塗られた部分の面積を求めなければならない 2015/7/11 13
  • 14. B問題 アルゴリズム • 処理 – 色を塗られた部分の面積を求めなければならない – まず、最初は何も塗られていない状態 2015/7/11 14
  • 15. B問題 アルゴリズム • 処理 – 色を塗られた部分の面積を求めなければならない – まず、最初は何も塗られていない状態 – そこから、まず一番外側の円を赤く塗る 2015/7/11 15
  • 16. B問題 アルゴリズム • 処理 – 色を塗られた部分の面積を求めなければならない – そこから、まず一番外側の円を赤く塗る – 次に、2番目の円を白く塗る 2015/7/11 16
  • 17. B問題 アルゴリズム • 処理 – 色を塗られた部分の面積を求めなければならない – そこから、まず一番外側の円を赤く塗る – 次に、2番目の円を白く塗る – これを繰り返すことで、全ての色を塗ることが出来る 2015/7/11 17
  • 18. B問題 アルゴリズム • 処理 – 色を塗られた部分の面積を求めなければならない – そこから、まず一番外側の円を赤く塗る – 次に、2番目の円を白く塗る – これを繰り返すことで、全ての色を塗ることが出来る – では、どう計算すればいいか? • 赤く塗る、の部分で、塗った面積を足す • 白く塗る、の部分で、塗った面積を引く – 上記を繰り返すことにより、赤い部分の面積を求めること が出来る 2015/7/11 18
  • 19. B問題 アルゴリズム • 解法まとめ – まずはRiの値を大きい順にソートする • ソートアルゴリズムは、大体の言語で標準で実装されている • 普通は昇順(小さい順)にソートされるので注意 – 小さい順に処理をすると混乱しやすいが、別にできなくはない – 次に、外側の円から順番に、面積を計算していく • 赤・白が交互に出てくることに注意 • 円の面積は、(半径)×(半径)×(円周率) • 円周率は、3.14じゃダメ!標準で入っている言語が多いです。 – 入っていない場合は、調べて十分な精度までコードに埋め込みま しょう。 – 最後に回答を出力 2015/7/11 19
  • 20. B問題 アルゴリズム • 出力 – 今回は、小数を出力する必要がある – 小数の出力方法も、言語によって違う • 練習ページには書いていないので、ほかの人の提出を見よう! – 普通に出力すると、様々な問題があります。 • 桁数が大きいときに、指数表示で出力されてしまう • 値が小さい時に、十分な精度の出力が行われない – 以上のようなことを避けるため、出力フォーマットを明記し ましょう。 • C/C++なら、printf(“%.14f¥n”, ans);など 2015/7/11 20
  • 21. ©AtCoder Inc. All rights reserved. 21 C問題 高橋君の給料 1. 問題概要 2. アルゴリズム 2015/7/11 21
  • 22. C問題 問題概要 • 社員がN人いる • 社長以外の社員は、上司を一人だけ持っている • 社員の給料は、直属の部下の給料の最大値・最小 値から算出できる • 社長の給料を求めよ • 制約 • 1 ≦ N ≦ 20 2015/7/11 22
  • 23. C問題 アルゴリズム • やるべきことは、問題文に書かれている処理を忠実 に書くだけ – その書き方が難しい! • どうして難しいか? – 自分の給料を決めるのは、「部下の給料」を知る必要が あるのに、「部下の一覧」は入力で与えられない • 「部下の一覧」ではなく「上司」が与えられる – 高橋君の給料を求めようと思っても、まず部下の給料を 求めないといけない! • 計算順序とかをちゃんと考えないといけない • 部下がいない時だけ計算式が違う 2015/7/11 23
  • 24. C問題 アルゴリズム • 気付くべきこと – 上司の番号は、必ず自分の番号より小さい • つまり、部下の番号は、必ず自分の番号より大きい • 自分より大きい社員番号の社員を、全部調べることにより、自分 の給料を算出できる • つまり、社員番号の大きい社員から順番に、給料を求めれば良 い – 上司の番号が与えられているなら、それを適当に処理す れば、部下の一覧も作れる • ListやVectorなどの配列を使うことで、適当に対応できる! 2015/7/11 24
  • 25. C問題 アルゴリズム • 実装方法 – 実装1:ループによる実装(もらう型) – 実装2:ループによる実装(配る側) – 実装3:再帰による実装 2015/7/11 25
  • 26. C問題 アルゴリズム • 実装1:ループによる実装(もらう型) – 予め部下リストを作る – 逆順に、部下リストから最大値と最小値を求め、給料を求めて いく for(int i = N - 1; i >= 0; i--){ if(sub[i].size()==0){P[i] = 1; continue;} maxP[i] = 0; minP[i] = (int)1e9; for(int j: sub[i]){ maxP[i] = max(maxP[i], P[j]); minP[i] = min(minP[i], P[j]); } P[i] = maxP[i] + minP[i] + 1; } 2015/7/11 26
  • 27. C問題 アルゴリズム • 実装2:ループによる実装(配る型) – 逆順に処理していく – 上司の最大値と最小値を更新し、、給料を求めていく for(int i = 0; i < N; i++){maxP[i] = 0; minP[i] = (int)1e9;} for(int i = N - 1; i >= 0; i--){ if(maxP[i]==0) P[i] = 1; else P[i] = maxP[i] + minP[i] + 1; maxP[boss[i]] = max(maxP[boss[i]], P[j]); minP[boss[i]] = min(minP[boss[i]], P[j]); } 2015/7/11 27
  • 28. C問題 アルゴリズム • 再帰による実装 – 部下リストを予め作る – 再帰で更新する int dfs(int id){ if(sub[id].size() == 0) return 1; int minP = (int)1e9; int maxP = 0; for(int i: sub[id]){ int P = dfs(i); minP = min(minP, P); maxP = max(maxP, P); } } 2015/7/11 28
  • 29. C問題 アルゴリズム • おまけ 部下リストの作り方 – boss[i]が、iの上司がboss[i]であることを示す – 上司の部下リストに自分を追加する、ということを繰り返 すことで作れる – 擬似コードは↓のような感じ List<int> sub[N]; for(int i=0;i<N;i++){ sub[boss[i]].add(i); } 2015/7/11 29
  • 30. C問題 アルゴリズム • 考察 – 「答えが非常に大きくなる」というが、どれくらいか? • 1の部下が2, 2の部下が3…というような構造になってる時が、最も 大きくなる • この時、2^n – 1が高橋君の給料になる。 – 今回の問題だと、1048575とかなので、int型で十分 – 計算量も気にしないで良い • 紹介したどの実装でもO(N)、かつNが20以下なので余裕 • 1億を超えるようなときだけ気を付けよう! 2015/7/11 30
  • 31. ©AtCoder Inc. All rights reserved. 31 D問題 高橋君ボール1号 1. 問題概要 2. アルゴリズム 2015/7/11 31
  • 32. D問題 問題概要 • 高橋君が、高橋君ボールを投げる • 投げた時間に対する距離f(t)は、以下の数式で表せ る – f(t) = At + Bsin(Ctπ) • f(t) = 100となるtを1つ求めよ • 制約 – 1 ≦ A,B,C ≦100 2015/7/11 32
  • 33. D問題 アルゴリズム • そもそもどんな関数なのかな? – 二つに分けて考えよう! • At – tに対してAだけ増加する直線 • Bsin(Ctπ) – 周期2/CのsinカーブをB倍したもの – つまり、「直線」と「sinカーブ」を足し合わせた関数 – f(t)=100を、数学的に直接求めようとするのは難しそう! • であれば、何か工夫して求めてみよう! 2015/7/11 33
  • 34. D問題 アルゴリズム • 関数のイメージ – 大体こんな感じ! • うねうねしながら増えてく 2015/7/11 34
  • 35. D問題 アルゴリズム • 直接答えを求められないときはどうすれば良いか? – 二分探索を使えば良い! • f(t)のtに、適当な値を入れる – f(t)が100より大きければtはそれより小さく、100より小さければ、tは それより大きいことを利用する • 具体的なアルゴリズム – 答えがt=0からt=10000の間にあるとする – ちょうど真ん中のt=5000を試す – f(t)<100なら、答えは5000から10000の間にあり、そうでないなら、0 から5000の間を調べれば良い – これを繰り返し、十分な精度になるまで答えを半分にしていく • これで本当に良い? – 関数が単調増加な関数でないので、これでは、f(t)=100のtの最小値 などは求められない – しかし、f(t)=100となる、tの1つを求めるだけなら、これで十分! 2015/7/11 35
  • 36. D問題 アルゴリズム • なぜ二分探索で答えが求められるのか? – 例えば、f(t)=100がこの黒い線だったとする • 解となるtは、最低1つはあり、図のようにたくさんある場合もある 2015/7/11 36
  • 37. D問題 アルゴリズム • なぜ二分探索で答えが求められるのか? – 例えば、f(t)=100がこの黒い線だったとする • 解となるtは、最低1つはあり、図のようにたくさんある場合もある – 今、青い線の間に答えがある、というところまで絞れてお り、緑の線の間に答えがあることが解っているとする • どちらを取っても解の取りこぼしが起こる? – 取りこぼしは発生するが、 左の範囲を選択した時に、 絶対に解の1つが間にある事が 保証される! 2015/7/11 37
  • 38. D問題 アルゴリズム • なぜ解が必ずあるか? – この関数f(t)は、tに対して連続である – f(左青)≦100≦f(緑)の時、f(t)は連続であるので、左青と 緑の間に、必ずf(t)=100となるtが存在する! • 中間値の定理 2015/7/11 38
  • 39. D問題 アルゴリズム • 擬似コードはおおよそこんな感じ – t≧200であれば、f(t)≧100は簡単に示せる double low = 0; high = 200; for(int i=0;i<100;i++){ double mid = (low+high)/2; if(f(t)<100) low = mid; else high = mid; } print(low); 2015/7/11 39
  • 40. D問題 アルゴリズム • 注意点 – 誤差が非常に厳しいので気を付けましょう! • f(t)の誤差が10^-6まで許される – tが10^-9程度変わると、f(t)は10^-5くらい変わったりする – よって、10^-11程度の精度はあった方が安心 – 二分探索の打ち切り条件に気を付けよう! – 出力桁数にも注意しよう! 2015/7/11 40