Codeforces-1011-C(水)
阿新 • • 發佈:2018-11-15
Codeforces 1011C - Fly
題目原址
[http://codeforces.com/contest/1011/problem/C]
題意
n 是加上地球和火星的總星球數,m 是火箭不帶燃料的質量。
a[i] 和 b[i] 是每個星球起飛和降落 1 噸物質所需要的燃料。
求 從地球到火星再到地球所需要的最少燃料 。
題解
對於每一次的起飛或降落,初始火箭加燃油質量為
,那麼
由此可知,設 x 為所需燃料質量,那麼只要解下式中的x即可
所以先用一個 k 邊錄入,a b 邊計算 k ,最後算出 x 即可
最後判斷 x 是否大於 1e9 ,若不大於則輸出 x ,大於則輸出 -1
注意
計算的時候若 a[i] 或 b[i] 為1時,直接退出然後輸出結果 -1 ,否則會出現 RE
實現
#include <stdio.h>
int main() {
int n, m;
int a[1005], b[1005];
scanf("%d %d", &n,&m);
double fuel=1;
double ans;
int i;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
if (a[i] == 1)
goto fin;
fuel *= (1 - 1.0 / a[i]);
}
for (i = 0; i < n; i++) {
scanf("%d", &b[i]);
if (b[i] == 1)
goto fin;
fuel *= (1 - 1.0 / b[i]);
}
ans = m * (1 / fuel - 1);
if (ans > 1e9 + 1e6)//18/11/14更新
goto fin;
else
printf("%lf\n", ans);
return 0;
fin:return 0 * printf("-1\n");
}
錯誤更新(18/11/14)
前天發現,這段程式碼用 Clang++17 Diagnostics 編譯器能過,但是 GNU C++11 就會出現 WA on test 58 。
樣例 58 的答案剛好是要輸出
,
前者算到的答案比
小,但誤差小於精度,於是被認為通過;
後者算到的答案比
大,誤差也小於精度,但是卻被誤以為是大於
的結果而輸出了 -1 ,而導致了測試不通過。
於是只要把最後的判斷條件ans > 1e9
改為ans > 1e9 + 1e6
即可解決這個問題。
已在上面直接做更改