C

  总共有n个星球,然后每个星球都有一个起飞燃料的使用效率a[i]和降落的燃料使用效率b[i],就拿起飞来说,也就是起飞每消耗1吨燃料可以提升的物品吨数,假如起飞前总重为m+f,那么起飞消耗(m+f)/a[i]吨燃料,起飞后总重为m+f-(m+f)/a[i]。

  这题反着推就行,比如说是从1->2->3->4->1 ,只需要从终点也就是最后一个1出发往前推并且还要假设在最后一个1位置只有货物重量m没有燃料质量,只有这样推出的在第一个1的起飞前所携带燃料质量才是最小的,这题我当时是推公式的时候卡了,打完了又推出来了,起飞前燃料质量=(起飞后的燃料质量*对应星球的起飞燃料效率+货物质量m)/(对应星球的起飞燃料效率-1),降落前的燃料质量=(货物质量m+降落后的燃料质量*对应星球的降落燃料效率)/(对应星球的降落燃料效率-1).还要注意一旦有一个星球的a[i]或是b[i]等于1了,那就说明无法就1到n再回到1,因为燃料效率为1的话就说携带了多少吨的东西就要消耗多少吨的燃料,比如说携带了m货物,f燃料,那么就要消耗m+f燃料,这明显是不可能的.

#include<bits/stdc++.h>
using namespace std;
double a[1005],b[1005];
int main()
{
    int n,m;
    cin>>n>>m;
    int flag=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]==1)
            flag=0;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        if(b[i]==1)
            flag=0;
    }
    if(!flag)
    {
        cout<<-1<<endl;
        return 0;
    }
    double f=m/(b[1]-1);
    for(int i=n;i>=1;i--)
    {
        f=(f*a[i]+m)/(a[i]-1);
        if(i==1) break;
        f=(m+f*b[i])/(b[i]-1);
    }
    printf("%.10lf
",f);
    return 0;

}
原文地址:https://www.cnblogs.com/eason9906/p/11755058.html