CF1011C

题目链接

题目描述

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\n");
    else printf("%.8f\n",l);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ullio/p/9383951.html