zoukankan      html  css  js  c++  java
  • 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
    ");
    	else printf("%.8f
    ",l);
    	return 0;
    }
    
  • 相关阅读:
    UVA 10935 约瑟夫环
    分拆素数和 埃氏筛法
    POJ 2349 Prim
    POJ 2031 prim
    POJ 1861 Kruskal
    POJ 2395 Prim
    POJ 1751 Prim
    POJ 2421 Prim
    vuejs开发环境搭建及热更新
    vuejs介绍
  • 原文地址:https://www.cnblogs.com/ullio/p/9383951.html
Copyright © 2011-2022 走看看