3月 30, 2008

【解題】售票系統 - Sales

@
台北市95學年度高中資訊學科能力競賽 - 售票系統 (Sales)


問題描述

  「低利航空公司」因與同業競爭,經常給予預購票大幅折扣。近年來因為油價高漲,經過細算,該公司所飛行的航班必須以票面價售出 30% 的機位才能打平所有的支出,因此該公司必須減少每張票的折扣數或者提高票面單價,來提昇公司獲利水準。但是全面提高票價可能會造成客源的流失,因此企畫部門提出了以下的動態調整機位售價的模式:

  給定某航段的票面價及機位數,前 20% 賣出的機位售價為票面價之 70%,前 21% ~ 40% 賣出的機位售價為票面價之 80%,前 41% ~ 60% 賣出的機位售價為票面價之 90%,最後售出的機位則全部為票面價。

  請寫一個程式來幫助「低利航空公司」計算每天每班飛航班機的利潤或虧損。計算過程皆四捨五入至整數。


輸入格式(標準輸入)

  每個測試資料有一行數字,數字之間以空白隔開。第一個整數代表該航班的票面價 s, s ≦ 5,000,第二個整數代表機位數 t, t ≦ 250,第三個整數 n, 0 ≦ n ≦ 10 代表該航班共有 n 個訂位記錄,後面則有 n 個整數,分別代表每個訂位的機位數。當然,所訂的機位總數不會超過 t。


輸出格式(標準輸出)

  請輸出飛航該班機的利潤或虧損金額。


輸入範例

4 5
0 0 1 1 0
0 1 1 1 1
0 1 1 1 1
0 0 1 0 0


輸出範例

8


解題思考

  首先,我們先根據總人數(由各筆訂位紀錄的人數總和)與機位數,計算出訂位數所佔總機位數的百分比。

  接著只要按照題意,「前多少百分比的機票打多少折」再扣掉成本(票面價乘上總機位數的30%),就可以了。

  這題本身不難。只要能夠正確的列出算式,應該就能很輕易的靠程式實現。


參考解答(C)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n, i, m;
    float s, t, man = 0, per;

    printf("請依序輸入票價 機位 訂位次數 訂位人數:\n");
    scanf("%f%f%d", &s, &t, &n);

    for(i = 0; i < n; i++)
    {
        scanf("%d", &m);
        man += m;
    }

    per = man / t;

    if (per <= 0.2)         { s *= man * 0.7 - t * 0.30; }
    else if (per <= 0.4)    { s *= man * 0.8 - t * 0.32; }
    else if (per <= 0.6)    { s *= man * 0.9 - t * 0.36; }
    else                    { s *= man       - t * 0.42; }

    printf("利潤計算結果:%.0f 元\n", s);
    system("pause");
}


參考解答(Ruby)

line = $stdin.gets.split()
s = line[0].to_i
t = line[1].to_i
n = line[2].to_i
p = 0

n.times{|i|
    p += line[i + 3].to_i
}

per = Rational(p, t)

if per <= 0.20
    s *= p * 0.70 - t * 0.30
elsif per <= 0.40
    s *= p * 0.80 - t * 0.32
elsif per <= 0.60
    s *= p * 0.90 - t * 0.36
else
    s *= p - t * 0.42
end

0 回覆:

張貼留言