MSペイントで縦書きどうやるんだ pic.twitter.com/QJzy27Zmxo
— 高橋 直大(chokudai) (@chokudai) 2015, 7月 11
結果
D問題は答えが複数あるが故、Sample Imput だけでは正解しているかどうか分からず、適当に提出しまくってたら12回も誤答してしまいましたw でも、提出してるうちに分かってきて、最終的には正しい答えに辿りつけました。
A - 掛け算の最大値
x + y = A となる x, y 全ての組に対して x * y を計算して最大値をとるだけでいい
class Main { static Scanner sc = new Scanner(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { int a = sc.nextInt(); int ans = 0; for(int i = 1; i < a; i++) { int j = a - i; ans = Math.max(ans, i*j); } System.out.println(ans); } }
実は入力はかならず偶数らしいのでこんなことしなくていい。
B - N重丸
最も大きい円の面積 - 2番目のに大きい円の面積 + 3番目に大きい円の面積 - ...
class Main { static Scanner sc = new Scanner(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { int n = sc.nextInt(); int[] r = new int[n]; for (int i = 0; i < n; i++) { r[i] = sc.nextInt(); } Arrays.sort(r); double ans = 0; int mult = 1; for (int i = n-1; i >= 0; i--) { ans += mult * Math.PI * r[i] * r[i]; mult *= -1; } System.out.printf("%.8f\n", ans); } }
C - 高橋君の給料
木構造を生成して再帰的に給料を求めていくだけ
解答: http://abc026.contest.atcoder.jp/submissions/444764
D - 高橋君ボール1号
二分探索すればいい。区間 left <= t <= right
について考える。center = (left + right) / 2
とする。
f(left)
と f(center)
が100をまたいでいる場合は区間を left <= t <= center
に絞る。そうでない場合は center <= t <= right
に絞って探索すればいい。f(center) - 100
を調べて差が 0.000001 以下だったら終了。区間は割りと適当に決めてもできる気がするが、最初の center を A * center = 100 となる点として、その前後でsinがπだけ変化する区間にした。
解答: http://abc026.contest.atcoder.jp/submissions/446199
反省
D問題難しく考え過ぎた。