题目链接
题目描述
N个星球,每个星球有两个值a[i],b[i],分别表示起飞时每份油的能带起的重量,和降落时的..(油会在当前操作完成时瞬间花掉)
现在给你货物重量M,问按1-N-1的顺序走一圈,最少要在1号星球带多少油.
若不成立输出-1.(保证带的油数最大不会超过1e9)
输入输出格式
输入格式:
第一行两个整数n,m
第二行N个整数a[i]
第三行N个整数b[i]
(2<=n<=1000)
(1<=m<=1000)
(1<=ai,bi<=1000)
输出格式:
一个数,表示最少需要带的油数
(与标准答案相差在1e-6之内视为正确答案)
样例
输入样例 | 输出样例 |
---|---|
2 12 11 8 7 5 | 10.0000000000 |
3 1 1 4 1 2 5 3 | -1 |
6 2 4 6 3 3 5 6 2 6 3 6 5 3 | 85.4800000000 |
思路
1.二分
因为保证了最大携带油数
所以直接二分判断就可以了
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <map>
#define ll long long
#define ull unsigned long long
#define ci const int&
#define cl const long long&
#define cul const unsigned long long&
#define io_f std::ios::sync_with_stdio(false)
using namespace std;
const double eps=1e-10;
int n,m;
int a[1001],b[1001];
inline bool check(double x) {
x-=(x+m)/a[1];
for(int i=2;i<=n;i++) {
x-=(x+m)/b[i];
x-=(x+m)/a[i];
}
x-=(x+m)/b[1];
return x>=0;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
double l=-0.0,r=1e9+107;
while(r-l>=eps) {
double mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}
if(r>1e9+100)printf("-1
");
else printf("%.8f
",l);
return 0;
}