Codeforces Round #499 (Div. 2) C

6 篇文章 0 订阅
1 篇文章 0 订阅

题目大意

做火箭去火星,经过一段路径,问要带多少燃料。
经过的路径为1->2->3->…->n->1(注意不是n->n-1->n-2->…->1)
在第i个星球上,1吨燃料可以起飞ai吨的重量,可以降落bi吨的重量,认为起飞和降落是瞬移,比如10吨的火箭和8吨的燃料共18吨,在bi=6的星球上降落,消耗3吨燃料,降落后质量为15吨
问最少要带多少吨燃料

最少带的燃料当然就是返回1时刚好用完了。。。我们假设起飞(降落)前的【总】重量为x,那么起飞(降落)后剩余的质量为 xxai x − x a i xxbi x − x b i ),这个质量恰好就是下一次降落(起飞)前的质量,所以设初始质量为x,从第一个星球起飞后的质量为 x(11a1) x ( 1 − 1 a 1 ) ,在第二个星球上降落后的质量为 x(11a1)(11b2) x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ,在第二个星球上起飞后的质量为 x(11a1)(11b2)(11a2) x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ( 1 − 1 a 2 ) ,以此类推,重新降落到第一个星球,结束行程后的质量为 x(11a1)(11b2)(11a2)...(11bn)(11an)(11b1) x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ( 1 − 1 a 2 ) . . . ( 1 − 1 b n ) ( 1 − 1 a n ) ( 1 − 1 b 1 )

要使带的燃料最少,也就是说降落后的质量刚好等于火箭的质量,那么就有

x(11a1)(11b2)(11a2)...(11bn)(11an)(11b1)=m x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ( 1 − 1 a 2 ) . . . ( 1 − 1 b n ) ( 1 − 1 a n ) ( 1 − 1 b 1 ) = m

注意上式中的x为初始质量,即火箭+燃料的质量,那么根据这个等式我们就可以得到公式

燃料质量 t=(aibiai1bi11)×m t = ( ∏ a i ∏ b i ∏ a i − 1 ∏ b i − 1 − 1 ) × m

显然可以发现如果任意的ai或bi为1,那就无解,这个结论是显然符合条件的。

公式出来了其他也不多说了,上代码

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int a[maxn], b[maxn];
int main() {
    bool flag = false;
    int n, m; cin>>n>>m;
    for(int i = 0; i < n; i++) { cin>>a[i]; if(a[i] <= 1) flag = true; }
    for(int i = 0; i < n; i++) { cin>>b[i]; if(b[i] <= 1) flag = true; }
    if(flag) printf("-1\n");
    else {
        double ans = 1;
        for(int i = 0; i < n; i++) {
            ans = ans * (double) a[i] * (double) b[i] / (double) (a[i]-1) / (double) (b[i]-1);
        }
        if(ans > 1e9) printf("-1\n");
        else printf("%.10lf\n", (ans-1) * m);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值