zoukankan      html  css  js  c++  java
  • 2018/7/29 cf 499 div 2(1011)

    这场很水,但是出题太慢了。。。怠惰啊。。。

    C. Fly

    http://codeforces.com/contest/1011/problem/C

    题意:宇宙之旅,途经n个星球,起飞、降落都需要燃烧燃料,火箭为m,在星球i上起飞每消耗1t燃料可以驱动a[i]重量的火箭, 降落是b[i],求解完成本次旅行需携带的最少燃料量。(精确到1e-10,误差<1e-6)

    思路:设旅途结束燃料恰好耗尽,则最终的火箭重量就是m,依此求解即可。

    1.可以从重量m开始倒着加(n...1)。

    2.设火箭本身重量(m)+燃料重量(x)总重量为1遍历求解得到一个“单位”最终重量即“火箭重量”ans,则由1/ans = (m + x)/m可以求解出x.

    3.二分(因为B题是二分下意识这么写了,但这是最暴力无脑且易错的解法了,思维定势导致了化简为繁,最终因为对二分算法的不熟悉导致contest时间内没能AC。。。但是二分上下界窝似乎总是写不好啊。。。最后换了解法AC二分什么的也不想改了。。。非常怠惰。。。)

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1000 + 5;
    int a[N], b[N];
    
    int main()
    {
        int n, m;
        scanf("%d %d", &n, &m);
        double ans = 1;;
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        for(int i = 0; i < n; i++) scanf("%d", &b[i]);
        b[n] = b[0];
        for(int i = 0; i < n; i++){
            ans -= ans / a[i];
            ans -= ans / b[i + 1];
        }
        ans = m / ans - m;
        if(ans <= 0.0) puts("-1");
        else printf("%.10f
    ", ans);
        return 0;
    }
    思路2
    #include<bits/stdc++.h>
    using namespace std;
    int a[1005];
    int b[1005];
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
           for(int i=1;i<=n;i++)
           {
               scanf("%d",&a[i]);
           }
           for(int i=1;i<=n;i++)
           {
               scanf("%d",&b[i]);
           }
           swap(b[1],b[n]);
           double tmp=m;
           double x=0;
           double tx=0;
           bool flag=true;
           for(int i=n;i>=1;i--)
           {
               if(b[i]<=1)
               {
                   flag=false;
                   break;
               }
               tx=tmp/(b[i]-1);
               tmp+=tx;
               x+=tx;
               if(a[i]<=1)
               {
                   flag=false;
                   break;
               }
               tx=tmp/(a[i]-1);
               tmp=tx+tmp;
               x+=tx;
           }
           if(flag)
           printf("%lf
    ",x);
           else
            printf("-1
    ");
        }
        return 0;
    }
    思路1 from zx.
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    double m;
    double a[1005],b[1005];
    bool C(double mid)
    {
        if(mid<=0) return 0;
        for(int i=0;i<n-1;i++)
        {
            mid-=(m+mid)/a[i];
            mid-=(m+mid)/b[i+1];
            if(mid<=0) return 0;
        }
        mid-=(m+mid)/a[n-1];
        if(mid<=0) return 0;
        mid-=(m+mid)/b[0];
        return mid>=0;
    }
    int main()
    {
        while(~scanf("%d",&n))
        {
            scanf("%lf",&m);
            for(int i=0;i<n;i++)
                scanf("%lf",&a[i]);
            for(int i=0;i<n;i++)
                scanf("%lf",&b[i]);
            double l=1,r=1e9+10,ans=0;
            int flag=0;
            for(int i=0;i<100;i++)
            {
                double mid=(l+r)/2;
                if(C(mid))
                {
                    r=mid;
                    ans=mid;
                    flag=1;
                }
                else l=mid;
            }
            if(!flag)
                puts("-1");
            else printf("%.10lf
    ",ans);
        }
        return 0;
    }
    思路3 from xc.
  • 相关阅读:
    # 项目js文件修改后chrome无法更新的解决办法
    # 最小费用最大流
    《Ray Tracing in One Weekend》笔记
    关于 PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比的个人理解
    PAT 甲级测试题目 -- 1017 Queueing at Bank
    pat 甲级测试题目 -- 1016 Phone Bills
    PAT 甲级测试题目 -- 1015 Reversible Primes
    PAT 甲级测试题目 -- 1014 Waiting in Line
    PAT 甲级测试题目 -- 1013 Battle Over Cities
    MacOS 相关开发环境配置
  • 原文地址:https://www.cnblogs.com/curieorz/p/9385794.html
Copyright © 2011-2022 走看看