# Simulation# Array# Greedy

k076 - 簡易棒球模擬

🔗 前往 ZeroJudge 原題

題目描述

題目描述一個簡易的棒球模擬情境。給定三、二、一壘上是否有人的狀態(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];
}

Discussion