# Greedy# Array# Simulation

k468 - 打靶 (Target)

🔗 前往 ZeroJudge 原題

題目描述

題目描述一個打靶的遊戲,有 n 個靶子,每個靶子有其分數 a[i]。玩家每次射擊一個靶子,如果該靶子的射擊次數達到 s 次,且該靶子的分數等於目標分數 f,則遊戲結束。目標是找出遊戲結束時射擊的靶子總數。如果沒有射擊到目標靶子達到 s 次,則不輸出任何東西。

解題思路

這題可以使用貪心策略來解決。我們遍歷每個靶子,如果該靶子的射擊次數小於其大小,或者已經射擊過該靶子且上次射擊的位置小於當前位置,則射擊該靶子,並增加射擊次數。如果射擊的靶子分數等於目標分數 f,且射擊次數達到 s,則輸出射擊次數並結束程式。

複雜度分析

  • 時間複雜度: O(n)
  • 空間複雜度: O(n)

程式碼

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,s,f,a[3505],ct[10005],ans;
vector <ll> b[10005];
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> n >> s >> f;
	for(int i=0;i<n;++i){
		cin >> a[i];
		b[a[i]].push_back(i);
	}
	for(int i=0;i<n;++i){
		if(ct[a[i]]>=b[a[i]].size()||(ct[a[i]]&&b[a[i]][ct[a[i]]-1]>=i))continue;
		ct[a[i]]+=2;
		++ans;
		if(a[i]==f&&ct[a[i]]>=s){
			cout << ans;
			return 0;
		}
	}
}

Discussion