#ABC_046C AtCoderくんと選挙速報
##ceilの使い方について
以下の問題を解いている中でceilの使い方で不明点があるためアドバイスをいただけると幸いです。
##ABC_046C
シカのAtCoDeerくんは選挙速報を見ています。
選挙には二人の候補高橋くんと青木くんが出ています。
速報では、現在の二人の得票数の比が表示されていますが、得票数そのものは表示されていません。
AtCoDeerくんは N回画面を見て、 i(1≦i≦N)回目に見たときに表示されている比は Ti:Aiでした。
ここで、AtCoDeerくんが選挙速報の画面を1回目に見た段階で既にどちらの候補にも少なくとも一票は入っていたことがわかっています。
N回目に画面を見たときの投票数(二人の得票数の和)として考えられるもののうち最小となるものを求めてください。ただし、得票数が途中で減ることはありません。
自力では解くことができず解答を参考にしながら以下のように実装をしました。
今回問題となっているのか解答が示すn=max([A/x], [B/y])をどのように実装するかという問題です。
##解答
次に満たすべき比率かx:yだとすると、 A<=nx && B <= nyなるような最小の自然数nを取れば次にあり得る最小の得票数はnx, nyだとわかります。
このようなnはmax([A/x], [B/y])で計算できます。
##私の実装
私はnをceilを用いた計算で実装をしましたがこれでは不正解となってしまいました。
このceilを用いた式のどこに問題があるのかアドバイスをいただけると幸いです。
またこの場合はどのように実装するべきなのかもアドバイスをいただけるとありがたいです。
よろしくお願いいたします。
c++
1#include <bits/stdc++.h> 2using namespace std; 3using ll = long long; 4const long long INF = 1LL << 60; 5 6int main(){ 7 int N; 8 cin >> N; 9 vector<ll> t(N), a(N); 10 for(int i=0; i<N; i++) { 11 cin >> t[i] >> a[i]; 12 } 13 14 15 ll T = 1, A = 1; 16 for(int i=0; i<N; i++) { 17 ll n = max(ceil((double)T/t[i]),ceil((double)A/a[i])); 18 T = n * t[i]; 19 A = n * a[i]; 20 } 21 cout << T + A << endl; 22}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/03 13:30