【思维题】CodeForce 1010A Fly
程序员文章站
2024-03-17 15:30:10
...
这段时间要沉迷刷题一段时间了,就让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;
}
如果有什么问题,欢迎大家指正!!!