# APCS實作題2020年7月第1題:購物車 > 日期:2023年9月13日 > 作者:王一哲 > 題目來源:109年7月實作題第1題 > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=f579) <br /> ## 題目 ### 問題描述 給兩個整數 $a$、$b$,代表你要觀察的商品編號。 商場在每一位客人的購物車都放置了一個感應器,能夠得知每位客人將商品放入購物車或拿出購物車。感應器存放的紀錄是一連串的整數,一個正整數 $x$ 表示這位客人將一個編號是 $x$ 的商品放入他的購物車,一個負數 $-x$ 表示這位客人將一個編號是 $x$ 的商品從他的購物車移除。 現在有 $n$ 位客人的購物車紀錄,你想要統計有幾位客人最後有購買商品 $a$ 與 $b$ 商品,一個客人有購買商品 $x$ 表示商品 $x$ 在他的購物車中放入的次數比拿出還多。 <br /> ### 輸入格式 第一行有兩個正整數 $a$、$b$($1 \leq a, b \leq 100$)。 第二行有一個正整數 $n$($1 \leq n \leq 100$),表示客人的數量。 接下來有 $n$ 行,第 $i$ 行表示第 $i$ 位客人的購物車紀錄。對於每個購物車紀錄包含一連串的整數,最後一個數字必定為 0,表示購物紀錄結尾,其他數字必定為非 0 的整數且絕對值不超過 100,定義同題目敘述。 配分 - 50分:每一行購物車紀錄只有 2 個正整數與一個結尾 0 (不會有取出的動作)。 - 50分:同原題目限制。 <br /> ### 輸出格式 輸出一個整數,表示有幾位客人同時有購買商品 $a$ 與商品 $b$。 <br /> ### 範例一:輸入 ``` 1 8 5 1 8 0 5 6 0 2 7 0 8 1 0 33 22 0 ``` ### 範例一:正確輸出 ``` 2 ``` <br /> ### 範例二:輸入 ``` 3 9 2 3 9 -3 3 9 0 3 3 -3 -3 9 0 ``` ### 範例二:正確輸出 ``` 1 ``` <br /> ## Python 程式碼 於 ZeroJudge 測試結果,最長運算時間約為 28 ms,使用記憶體最多約為 3.3 MB,通過測試。 ```python= a, b = map(int, input().split()) # 讀取要觀察的商品編號 n = int(input()) # 讀取顧客人數 ans = 0 # 答案預設為0 for _ in range(n): # 讀取n行資料 na, nb = 0, 0 # 這個顧客購買商品a、b的數量,預設為0 data = list(map(int, input().split())) # 讀取購物車紀錄存入串列 data for d in data: # 由 data 依序讀取紀錄,計算購買商品a、b的數量 if d == a: na += 1 elif d == -a: na -= 1 elif d == b: nb += 1 elif d == -b: nb -= 1 if na >= 1 and nb >= 1: ans += 1 # 如果 na、nb 皆大於等於1,ans 加1 print(ans) # 印出答案 ``` <br /><br /> ## C++ 程式碼 於 ZeroJudge 測試結果,最長運算時間約為 5 ms,使用記憶體最多約為 332 kB,通過測試。 ```cpp= #include <iostream> using namespace std; int main() { int a, b, n, ans = 0; // 答案預設為0 cin >> a >> b; // 讀取要觀察的商品編號 cin >> n; // 讀取顧客人數 for(int i=0; i<n; i++) { // 讀取n行資料 int na = 0, nb = 0, d;// 這個顧客購買商品a、b的數量,預設為0;購物車紀錄d while(cin >> d) { if (d == a) { na++; } else if (d == -a) { na--; } else if (d == b) { nb++; } else if (d == -b) { nb--; } else if (d == 0) { break; } } if (na >= 1 && nb >= 1) ans++; // 如果 na、nb 皆大於等於1,ans 加1 } cout << ans << endl; // 印出答案 return 0; } ``` <br /><br /> --- ###### tags:`APCS`、`Python`、`C++`