这个题考试的时候一直把它当数学题推, 然而mdzz 光荣掉分
首先如果存在aiai或bibi为1的话肯定是无解的
特判掉这种情况后我们可以这样做
列出一个长度为2n2n的序列QQ
由题可知
那么我们就可以知道每一次1t1t燃料能携带的质量
并且我们还知道最后一次不剩燃料显然是最优秀的
那么我们考虑从最后开始倒推 由题意每一次飞行都满足以下式子
now+x=Q[i]×xnow+x=Q[i]×x, nownow为这一次飞行后剩下的质量, xx为这一次飞行后消耗的质量, 那么我们知道 nownow初始化为火箭的质量, 每次把算出来的xx累加到上去就可以得出答案了, 时间复杂度O(n)O(n)
Code
#include<bits/stdc++.h>
#define For(i, a, b) for(register int i = a; i <= b; ++ i)
#define FOR(i, a, b) for(register int i = a; i >= b; -- i)
using namespace std;
const int maxn = 1e3 + 10;
int a[maxn], b[maxn], Q[maxn << 1], n, m;
double ans, now;
int main() {
#ifndef ONLINE_JUDGE
freopen("c.in", "r", stdin);
freopen("c.out", "w", stdout);
#endif
scanf("%d%d", &n, &m); ans = m;
For(i, 1, n) {
scanf("%d", &a[i]);
if(a[i] == 1)
return puts("-1"), 0;
} a[n + 1] = a[1];
For(i, 1, n) {
scanf("%d", &b[i]);
if(b[i] == 1)
return puts("-1"), 0;
} b[n + 1] = b[1];
For(i, 1, n << 1)
Q[i] = (i & 1) ? a[i / 2 + 1] : b[i / 2 + 1];
FOR(i, n << 1, 1)
ans += ans / (Q[i] - 1);
printf("%.12f", ans - m);
return 0;
}