2016年9月16日 星期五

HackerRank Bon Appétit(Algorithms>Implementation)

題目:
Anna和Brian在一個餐廳點了n道菜,
但Anna拒絕吃第k道菜(0<= k < n, 菜的編號從0開始)
因為她會過敏。
所以他們決定要分攤所有他們有共食的菜的花費;
但是Brian有可能會忘記他們並沒有分攤第k道菜,
並且不小心向Anna收了這筆錢。

給定n, k,和這n道菜的各自價格以及Brian像Anna收她那部分的錢。
如果分帳公平,就印出Bon Appetit,
否則就印出Brian應該退給Anna的錢。

輸入:
第一行以空格隔開2個數,分別為n(總菜數), k(從0起算Anna沒吃的那道菜的編號)
第二行以空格隔開n個數,分別代表每道菜的價格。
第三行輸入的是Brian向Anna收取的分帳費用。

輸入限制:
2<=n<=10的5次方 (會不會點太多菜了!)
0<=k<n
0<=c[i]<=10的4次方(c[i]指第i道菜的價格)
0<=b<=(c[i]的總和)

輸出:
Brian沒有超收Anna錢的話,就印出Bon Appetit,
否則就印出差值以表示Brian必須退還給Anna的錢(這邊保證這會是整數)。

解題:
這題其實並不難,
問題在於輸入限制條件n最大可以到10的5次方
這兩個人的食量也是太扯了一點......
言歸正傳,這題仔細一看,我們並不需要記錄每道菜到底多少錢,
只需要算出拆帳金額,也就是把第k道菜以外的錢相加再除以2就行了!
故不需要額外開出每道菜金額的陣列,
只要讀進來相加除以2,
最後和charge比較,來決定印出的值。


Code:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int n, k, charge, actual = 0;
    scanf("%d %d\n", &n, &k);
    for(int i = 0; i < n; i++){
        int c;
        scanf("%d ", &c);
        if(i != k){
            actual += c;
        }
    }
    actual /= 2;
    scanf("%d", &charge);
    if(charge > actual)
        printf("%d", charge - actual);
    else
        printf("Bon Appetit");
    return 0;
}

沒有留言:

張貼留言