Garland POJ1759
投稿日: 更新日:
問題:http://poj.org/problem?id=1759
問題
個のランプをワイヤーにぶら下げます。一番左のランプの高さは、一番右のランプの高さはです。ランプの重みにより、ワイヤーはたるみます。この時以下の3つの式が成立します。
とが与えられるので、これら全ての条件を満たす最小のを小数第2位まで求めてください。
解法
与えられた式を変形します。
とが定まれば、上の漸化式を用いて全てのを確定することができます。はと与えられているので、適切なを探索すれば良いです。探索には二分探索を用います。、を決めたあと、全てのが0以上でるかを判定します。
実装
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
double a;
cin >> n >> a;
double ok = 1e9, ng = -1;
for(int ii = 0;ii < 100; ++ii){
double mid = (ok+ng)/2;
vector<double> h(n);
h[0] = a;
h[1] = mid;
for(int i = 2;i < n; ++i){
h[i] = 2*h[i-1] - h[i-2] + 2;
}
bool valid = true;
for(int i = 0;i < n; ++i){
if(h[i] < 0)valid = false;
}
if(valid){
ok = mid;
}else{
ng = mid;
}
}
vector<double> h(n);
h[0] = a;
h[1] = ok;
for(int i = 2;i < n; ++i){
h[i] = 2*h[i-1] - h[i-2] + 2;
}
printf("%.2f\n", h[n-1]);
return 0;
}