# 口罩預購系統 https://neoj.sprout.tw/problem/799/ ### 題目敘述 小芽是國的科技部長,因為病毒性肺炎的爆發,小芽決定帶領一群工程師建構自己的口罩預購系統。 然而,口罩的數量實在有限,因此一個人一個禮拜只能買一次口罩。 而且為了避免衛福部長開記者會時需要天天帶不同顏色的口罩,小芽希望購買的時候可以指定想要的顏色。 每種顏色都是用三種顏料調成的。但是顏料實在有限,如果指定的顏色顏料不足,就會用白色的口罩代替,因為白色是唯一不需要顏料的顏色 小芽定義了以下的資料型態: ```cpp struct Color{ /* 各需要多少顏料 */ int pigment1; int pigment2; int pigment3; }; struct Customer{ char name[20]; int lastBuyMonth; int lastBuyDate; Color color; }; ``` 假設今天是4月18日,且每種顏料一開始都有10000單位,要連續服務N個客人。 請你實作下列兩個函式 ```cpp bool isValid (Customer customer); //距離上次購買是否超過7天,即是否為4/11以前(含)購買 bool isAvailable (Customer customer); //指定的顏色是否有足夠的顏料可以製作口罩 ``` ### 上傳說明 你只需要完成並上傳isValid, isAvailable 兩個function就可以了。 **註:你有辦法不用全域變數做到嗎? ### 輸入說明 第一行有一個正整數N,代表有N個使用者。 接下來連續行,每行由一個字串及五個整數構成,依序代表使用者名稱、上次購買月份、上次購買日期、指定的顏色需要花掉多少顏料。 (你"無須"處理輸入的部分) ### 輸出說明 對於每位使用者:如果不能購買,輸出"Invalid.";如果"剩餘"顏料不足,只能買白色的口罩,輸出"Unavailable.";如果"剩餘"顏料足夠,可以購買指定顏色的口罩,輸出"You get what you want."。結尾皆須換行。 (你"無須"處理輸入的部分) 詳見範例說明。 ### 範例程式 ```cpp #include #include using namespace std; struct Color{ int pigment1; int pigment2; int pigment3; }; struct Customer{ char name[20]; int lastBuyMonth; int lastBuyDate; Color color; }; bool isValid(Customer customer); //距離上次購買是否超過7天,即是否為4/11以前(含)購買 bool isAvailable(Customer customer); //指定的顏色是否有足夠的顏料可以製作口罩 void getCustomer(Customer* customerPtr); //這隻程式已經幫你實作好了~ //你的程式會被放在這裡 int main(){ int N; cin >> N; Customer customer; while(N--) { getCustomer(&customer); //把資料讀到customer裡 if(!isValid(customer) ) cout << "InValid.\n"; else if(!isAvailable(customer) ) cout << "Unavailable.\n"; else cout << "You get what you want.\n"; } return 0; } ``` ### 範例輸入 ``` 4 ABC 1 1 1 0 0 DEF 4 12 9998 10000 10000 GHI 1 12 9998 10000 10000 JKL 3 3 5 5 5 ``` ### 範例輸出 ``` You get what you want. Invalid. You get what you want. Unavailable. ``` ### 範例說明 ABC上次購買超過7天,且10000 >= 1,10000 >= 0,10000 >= 0,因此可以製作指定顏色的口罩,顏料剩下(9999, 10000, 10000) DEF上次購買不足7天,無法購買 GHI上次購買超過7天,且9999 >= 9998,10000 >= 10000,10000 >= 10000,因此可以製作指定顏色的口罩,顏料剩下(1, 0, 0) JKL上次購買超過7天,但1 < 5,因此無法製作指定顏色的口罩,顏料維持(1, 0, 0) ### 測資說明 對於 10% 的測資,使用者上次購買皆超過七天,且皆要求白色 對於 40% 的測資,使用者皆要求白色 對於 100% 的測資,日期皆在1月1日至4月18日之間(假設平年),名稱長度皆小於20,各種顏料的用量皆在0到INT_MAX之間 # Code ```cpp bool isValid (Customer customer){ if (customer.lastBuyMonth >= 4 && customer.lastBuyDate >= 11) return false; return true; } bool isAvailable (Customer customer){ static int pigment1 = 10000, pigment2 = 10000, pigment3 = 10000; if (pigment1 - customer.color.pigment1 < 0) return false; if (pigment2 - customer.color.pigment2 < 0) return false; if (pigment3 - customer.color.pigment3 < 0) return false; pigment1 -= customer.color.pigment1; pigment2 -= customer.color.pigment2; pigment3 -= customer.color.pigment3; return true; } ```