# APCS實作題2023年1月第1題:程式考試
> 日期:2023年9月26日
> 作者:王一哲
> 題目來源:112年1月實作題第1題
> [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=j605)
<br />
## 題目
### 問題描述
給 $n$ 個提交紀錄,第 $i$ 個提交紀錄有兩個整數 $t_i$ 和 $s_i$ 代表上傳時間和該次上傳的分數,若第 $i$ 次的提交結果為嚴重錯誤,則 $s_i$ 為 $-1$。
計算總分的公式為提交紀錄中的 $最高分 - 總提交次數 - 總嚴重錯誤次數 \times 2$,若計算出來的分數為負數則計為 $0$。
請輸出總分和第一次獲得最高分的時間點。
<br />
### 輸入說明
第一行有一個正整數 $K (1 \leq K \leq 6)$ 代表提交的次數,接下來有 $K$ 行,第 $i$ 行有兩個整數 $t_i (1 \leq t_i \leq 100)$ 和 $s_i (-1 \leq s_i \leq 100)$。保證提交紀錄按照時間點嚴格遞增排序,並且第一個提交紀錄不會是嚴重錯誤。
- 60分:$K = 3$
- 40分:無其他限制
<br />
### 輸出說明
輸出兩個整數,代表總分和第一次獲得最高分的時間點。
<br />
### 範例一:輸入
```
5
3 89
5 -1
10 90
15 0
20 90
```
### 範例一:正確輸出
```
83 10
```
<br />
### 範例二:輸入
```
3
3 0
5 -1
6 -1
```
### 範例二:正確輸出
```
0 3
```
<br />
## Python 程式碼
於 ZeroJudge 測試結果,最長運算時間約為 30 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
K = int(input()) # 讀取提交答案次數 K
time, high = map(int, input().split()) # 讀取第一筆資料存入 time, high
error = 0 # 嚴重錯誤次數預設為0
for _ in range(1, K): # 讀取接下來的 K-1 筆資料
t, s = map(int, input().split()) # 讀取提交答案時間及分數
if s == -1: # 如果 s 為 -1,嚴重錯誤
error += 1 # error 加1
elif s > high: # 如果 s 大於目前的最高分
time = t # 更新時間
high = s # 更新最高分
score = high - K - error*2 # 計算總分
if score < 0: score = 0 # 如果總分是負的,重設為0
print("{:d} {:d}".format(score, time)) # 印出答案
```
<br /><br />
## C++ 程式碼
於 ZeroJudge 測試結果,最長運算時間約為 2 ms,使用記憶體最多約為 340 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
int K; cin >> K; // 讀取提交答案次數 K
int time, high; cin >> time >> high; // 讀取第一筆資料存入 time, high
int error = 0; // 嚴重錯誤次數預設為0
for(int i=1; i<K; i++) { // 讀取接下來的 K-1 筆資料
int t, s; cin >> t >> s; // 讀取提交答案時間及分數
if (s == -1) { // 如果 s 為 -1,嚴重錯誤
error++; // error 加1
} else if (s > high) { // 如果 s 大於目前的最高分
time = t; // 更新時間
high = s; // 更新最高分
}
}
int score = high - K - error*2; // 計算總分
if (score < 0) score = 0; // 如果總分是負的,重設為0
cout << score << " " << time << endl; // 印出答案
return 0;
}
```
<br /><br />
---
###### tags:`APCS`、`Python`、`C++`