【思维题】CodeForce 1010A Fly

版权声明:Johnson https://blog.csdn.net/m0_38055352/article/details/90721513

这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!

一、题目大意

题目的意思就是有N个星球,要求从第1个星球,不断经过起飞-降落,一直抵达第n个星球,然后再返回第一个星球,飞船去除燃料的重量为M,在第i个星球起飞所需燃料是:飞船总重量(包括燃料)/a[i],在第i个星球降落所需的燃料是:飞船总重量(包括燃料)/b[i],而你只能在第一个星球上填充燃料,问最少填充多少燃料可以让飞船最终能飞回来,如果飞不回来的话输出-1.

二、题目思路以及AC代码

首先这道题我是没想到这么简单。其实就是一个数学问题就可以解决。

用给的样例进行分析可以发现,如果从i星球起飞,设起飞前燃料为x,除燃料飞船重M,那么起飞后,飞船含燃料总重量为(x+M)×(a[i]-1)/a[i],继续看飞船降落,也有类似的公式为(x+M)×(b[i]-1)/b[i]。

对于最少的燃料,肯定最后是要燃料完全消耗完嘛,所以就可以列出一个方程式:

在这里插入图片描述
其中,x是表示最初填装的燃料,M是表示飞船除燃料重量,a和b分别是题目中对应的数组,这个等式的意思就是从最初的重量经过起飞-降落-起飞-降落…一系列变化,最终要保持重量为M,即将燃料消耗完。

所以我们只需要计算中间最长的部分,然后求解这个方程式就可以啦!这里不用担心溢出的问题,因为这里的分数都是小于1的,所以结果也不会溢出。但这里需要注意的是输出结果,一定要保留10位小数,按照题目来

下面给出AC代码:

#include <iostream>
#define MAXN 1005
using namespace std;

int N;
int M;
int a[MAXN];
int b[MAXN];

int main()
{
	cin >> N;
	cin >> M;
	for (int i = 1; i <= N; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= N; i++) {
		cin >> b[i];
	}

	double res = 1;
	for (int i = 1; i <= N; i++) {
		res *= ((double)(a[i] - 1) / a[i]);
		res *= ((double)(b[i] - 1) / b[i]);
	}
	
	double ans;
	if (res) ans = M / res - M;
	else ans = -1;

	printf("%.10f\n", ans);

    return 0;
}

如果有什么问题,欢迎大家指正!!!

猜你喜欢

转载自blog.csdn.net/m0_38055352/article/details/90721513