k076 - 簡易棒球模擬
題目描述
題目描述一個簡易的棒球模擬情境。給定三、二、一壘上是否有人的狀態(1 或 0),以及打者擊出的安打數(0 到 4),計算得分數量以及跑壘後三、二、一壘上是否有人的新狀態。
解題思路
這題的核心是模擬跑壘的過程。我們使用一個大小為 4 的陣列 a 來表示壘上的狀態,a[0] 代表一壘、a[1] 代表二壘、a[2] 代表三壘、a[3] 暫時儲存三壘的舊狀態。
對於每次打擊,我們首先計算得分。如果三壘上有跑者(a[3] 為 1),則得分增加 1。然後,我們將壘上的跑者向前推進。例如,一壘的跑者移動到二壘,二壘的跑者移動到三壘,三壘的跑者得分。
如果打者擊出 0 壘安打(出局),壘上的狀態不變。如果打者擊出 1 到 4 壘安打,壘上的跑者會根據安打數向前推進。
在模擬完跑壘後,我們需要更新一壘的狀態。如果這是第一次打擊(i == 0),則一壘上有跑者(a[0] = 1)。否則,一壘空壘(a[0] = 0)。
複雜度分析
- 時間複雜度: O(n),其中 n 是打擊次數。
- 空間複雜度: O(1),因為我們只使用固定大小的陣列。
程式碼
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[4],n,ans;
int main(){
cin.tie(0); ios::sync_with_stdio(0);
cin >> a[2] >> a[1] >> a[0] >> n;
for(int i=0;i<n;++i){
a[3]=a[2];
if(a[3])++ans;
a[2]=a[1];
a[1]=a[0];
if(i==0)a[0]=1;
else a[0]=0;
}
cout << ans << "\n" << a[2] << " " << a[1] << " " << a[0];
}