はじめに
ABC407に参加したので振り返ります。
結果は0冠でした。
A - Approximation
問題文
正整数$A$と正の奇数$B$が与えられます。
実数$A/B$との差が最小となる整数を出力してください。
ただし、制約のもとでそのような整数がただ一つ存在することを証明できます。
制約
- 1 ≦ $A$ ≦ 407
- 1 ≦ $B$ ≦ 407
- Bは奇数
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
A B
出力
$A/B$との差が最小となる整数を出力せよ。
解法
整数除算a / bは小数部分を切り捨てるため、商(整数部分)を直接得られる。また、剰余演算子%を用いることで、余りを簡単に取得できる
実装例
1.与えられた整数$A$と$B$を読み込む。
2.整数除算A / Bを用いて、$A/B$の整数部分$X$を求め、これを一時的な解答候補answerとする。
3.剰余演算A % Bを用いて、$A$を$B$で割った余り$Y$を求める。この余りは少数の分子に相当する。
4.あまり$Y$が$B/2$(整数除算)より大きいかどうかを判定する。
- もし$Y ≦ B/2$であれば、小数部分$Y/B$は0.5以下であるため、
answerが最も近い整数である。 - もし$Y > B/2$であれば、小数部分$Y/B$は0.5より大きいと判断されるため、
answer + 1が最も近い整数となる。
5.決定された整数を出力する。
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B;
cin >> A >> B;
int answer = A / B;
int remainder = A % B;
if (B / 2 >= remainder) {
cout << answer << endl;
} else {
cout << answer + 1 << endl;
}
}
B - P(X or Y)
問題文
1, 2, 3, 4, 5, 6の6種類の目が出るサイコロを2つ振ったときに、次の2つの条件の少なくとも一方を満たす確率を求めてください。
- 2つの出目の合計がX以上である。
- 2つの出目の差の絶対値がY以上である。
ここで、どちらのサイコロについても6種類のどの目が出るかは同様に確からしく、それぞれのサイコロの出目は独立であるとします。
制約
- 2 ≦ $X$ ≦ 13
- 0 ≦ $Y$ ≦ 6
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
X Y
出力
2つのサイコロの出目が2つの条件の少なくとも一方を満たす確率を出力せよ。出力された値と真の値との絶対誤差が$10^{-9}$以下のとき、正答と判定される。
解法
分からなかったのでGeminiに書かせました(後で頑張って理解します)。
実装例
#include <bits/stdc++.h>
using namespace std;
int main() {
int x, y;
cin >> x >> y;
double favorable_outcomes = 0;
double total_outcomes = 36.0;
for (int d1 = 1; d1 <= 6; ++d1) {
for (int d2 = 1; d2 <= 6; ++d2) {
if ((d1 + d2 >= x) || (std::abs(d1 - d2) >= y)) {
favorable_outcomes++;
}
}
}
cout << std::fixed << std::setprecision(10) << favorable_outcomes / total_outcomes << endl;
return 0;
}
おわりに
先週に引き続き、型の勉強を頑張ります。