[BOJ]17451-平行宇宙
https://www.acmicpc.net/problem/17451
質問する
西暦2 XXX年、地球は小惑星と冲突する危机に直面しています!聡明な科学者キパは、平行宇宙で地球に代わる惑星を探す困難な任務を担っている.
私たちは今地球上にいます(=惑星0).様々な要因を考慮して,惑星1,惑星2,...と惑星(n−1)を順番に確認し,地球(=惑星n)に戻ることがコスト的に最適であることが分かった.すべての整数1≦i地球上には「超高速走行機械」という特殊な装置があり、任意に速度を上げることができる.地球を離れるには速度を下げるしかなく、速度を上げることはできない.
次の地域に行くためには、原則として必要な速度を正確に調整しなければならないが、幸いなことに平行宇宙には一定の間隔があるため、必要な速度の正の整数倍も次の地域に移動することができる.また、十分な速度で移動しており、地球の代替惑星に到着した後、それが適切かどうかを知ることができるため、一部の惑星では、到着後に速度を維持し、次の惑星に移動することができます.
すべての1≦i≦nについて、惑星(i−1)から惑星iへの移動に必要な(最小)速度viが与えられる.地球上で向上しなければならない速度を最小限に抑える.
入力
第1行はn(1≦n≦3・105)を与える.
2行目には、n個の整数v 1、v 2、...とvnの間のスペースがあります.すべての整数1≦i≦nに対して、1≦vi≦109を満たす.
しゅつりょく
数を出力します.この数字は地球上で向上しなければならない速度の最高値だ.
サンプルI/O
入力例1 例出力1
いつ何倍のスピードで運転すればいいですか?これは決定すべき問題だ.特定の時点では、要求される速度が増加します.これはこの角度からどれだけ増やす必要があるかという問題です.
逆にチェックしながら、要求された速度で継続するかどうかを確認しても構いません.でもいつかそうじゃない.速度減少(逆に考えると速度を上げるべき)の時点から現在まで更新されている速度/その時点までの速度+1.何倍のスピードで走るか確認しなければなりませんから.そしてその時刻の速度を乗じる.これにより、すべての時点で満たされる速度が更新され続けます.
質問する
西暦2 XXX年、地球は小惑星と冲突する危机に直面しています!聡明な科学者キパは、平行宇宙で地球に代わる惑星を探す困難な任務を担っている.
私たちは今地球上にいます(=惑星0).様々な要因を考慮して,惑星1,惑星2,...と惑星(n−1)を順番に確認し,地球(=惑星n)に戻ることがコスト的に最適であることが分かった.すべての整数1≦i
次の地域に行くためには、原則として必要な速度を正確に調整しなければならないが、幸いなことに平行宇宙には一定の間隔があるため、必要な速度の正の整数倍も次の地域に移動することができる.また、十分な速度で移動しており、地球の代替惑星に到着した後、それが適切かどうかを知ることができるため、一部の惑星では、到着後に速度を維持し、次の惑星に移動することができます.
すべての1≦i≦nについて、惑星(i−1)から惑星iへの移動に必要な(最小)速度viが与えられる.地球上で向上しなければならない速度を最小限に抑える.
入力
第1行はn(1≦n≦3・105)を与える.
2行目には、n個の整数v 1、v 2、...とvnの間のスペースがあります.すべての整数1≦i≦nに対して、1≦vi≦109を満たす.
しゅつりょく
数を出力します.この数字は地球上で向上しなければならない速度の最高値だ.
サンプルI/O
入力
5
300 400 500 400 300
900
Solution#include <iostream>
#include <vector>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
long long answer = 0;
int N;
cin >> N;
vector<long long> vec(N);
for(int i = 0; i < N; i++) cin >> vec[i];
for(int i = N - 1; i >= 0; i--){
if(answer <= vec[i]) answer = vec[i];
else{
if(answer % vec[i]){
answer = (answer / vec[i] + 1) * vec[i];
}
}
}
cout << answer << '\n';
}
逆算しなければならない.正の方向では計算しにくい問題です.いつ何倍のスピードで運転すればいいですか?これは決定すべき問題だ.特定の時点では、要求される速度が増加します.これはこの角度からどれだけ増やす必要があるかという問題です.
逆にチェックしながら、要求された速度で継続するかどうかを確認しても構いません.でもいつかそうじゃない.速度減少(逆に考えると速度を上げるべき)の時点から現在まで更新されている速度/その時点までの速度+1.何倍のスピードで走るか確認しなければなりませんから.そしてその時刻の速度を乗じる.これにより、すべての時点で満たされる速度が更新され続けます.
Reference
この問題について([BOJ]17451-平行宇宙), 我々は、より多くの情報をここで見つけました https://velog.io/@sierra9707/BOJ-17451-평행우주テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol