总共有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;
}