1. 程式人生 > >Codeforces-1011-C(水)

Codeforces-1011-C(水)

Codeforces 1011C - Fly

題目原址

[http://codeforces.com/contest/1011/problem/C]

題意

n 是加上地球和火星的總星球數,m 是火箭不帶燃料的質量。
a[i]b[i] 是每個星球起飛和降落 1 噸物質所需要的燃料。
從地球到火星再到地球所需要的最少燃料

題解

對於每一次的起飛或降落,初始火箭加燃油質量為 w 0

w_{0} ,那麼 w 1 = w 0
w 0 x 0 = w 0
( 1 1 x 0 ) w_{1} = w_{0}-\frac{w_{0}}{x_{0}}=w_{0}(1-\frac{1}{x_{0}})

由此可知,設 x 為所需燃料質量,那麼只要解下式中的x即可
w 0 = ( w 0 + x ) i = 0 n 1 ( 1 1 a i ) ( 1 1 b i ) w_{0}=(w_{0}+x)\prod_{i=0}^{n-1}{(1-\frac{1}{a_{i}})(1-\frac{1}{b_{i}})}
所以先用一個 k 邊錄入,a b 邊計算 k ,最後算出 x 即可
x = m ( 1 k 1 ) x = m(\frac{1}{k}-1)
最後判斷 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 0 9 10^9
前者算到的答案比 1 0 9 10^9 小,但誤差小於精度,於是被認為通過;
後者算到的答案比 1 0 9 10^9 大,誤差也小於精度,但是卻被誤以為是大於 1 0 9 10^9 的結果而輸出了 -1 ,而導致了測試不通過。

於是只要把最後的判斷條件ans > 1e9改為ans > 1e9 + 1e6即可解決這個問題。
已在上面直接做更改