# 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++`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.