这个题考试的时候一直把它当数学题推, 然而mdzz 光荣掉分
首先如果存在
ai
a
i
或
bi
b
i
为1的话肯定是无解的
特判掉这种情况后我们可以这样做
列出一个长度为
2n
2
n
的序列
Q
Q
由题可知
那么我们就可以知道每一次
1t
1
t
燃料能携带的质量
并且我们还知道最后一次不剩燃料显然是最优秀的
那么我们考虑从最后开始倒推 由题意每一次飞行都满足以下式子
now+x=Q[i]×x
n
o
w
+
x
=
Q
[
i
]
×
x
,
now
n
o
w
为这一次飞行后剩下的质量,
x
x
为这一次飞行后消耗的质量, 那么我们知道
now
n
o
w
初始化为火箭的质量, 每次把算出来的
x
x
累加到上去就可以得出答案了, 时间复杂度
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;
}