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

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\n", 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\n",x);
       else
        printf("-1\n");
    }
    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\n",ans);
    }
    return 0;
}
思路3 from xc.

 

posted on 2018-07-29 16:38  雪藤  阅读(105)  评论(0编辑  收藏  举报