
配点: 150 点 / 実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 26 / NoviSteps: 7Q
問題概要
正整数 と正の奇数
が与えられるので、実数
との差が最小となる整数を出力せよ。
制約
- 入力は全て整数
考察
答えの候補となる整数は、 と
の2つである。
したがって、実数 とこれら2整数との差の絶対値をそれぞれ計算し、小さい方を答えとして出力すればよい。
実装例において、床関数と天井関数については以下の記事で紹介したものを使っている。
実装例
#include <bits/stdc++.h> using namespace std; template <class T1, class T2> inline auto div_floor(T1 a, T2 b) { if (b < 0) a *= -1, b *= -1; if (a >= 0) return a / b; else return (a + 1) / b - 1; } template <class T1, class T2> inline auto div_ceil(T1 a, T2 b) { if (b < 0) a *= -1, b *= -1; if (a <= 0) return a / b; else return (a - 1) / b + 1; } // ======================================== // int main() { int A, B; cin >> A >> B; double div = (double)A / B; int x = div_floor(A, B); int y = div_ceil(A, B); if (abs(div - x) <= abs(div - y)) { cout << x << endl; } else if (abs(div - x) > abs(div - y)) { cout << y << endl; } return 0; }
実装時間: 5分以内
コメント
浮動小数点絡みの問題は心臓に悪い。