# Greedy# Conditional Statements# Simulation

d584 - 技能點數skill

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算楓之谷角色在特定職業和等級下擁有的技能點數。技能點數的獲得與角色的轉職等級(8, 10, 30, 70, 120)相關,每次轉職會獲得額外的技能點數,且每次升級也會獲得技能點數。

解題思路

此題的核心在於模擬角色升級和轉職的過程,並根據職業和等級計算技能點數。程式碼使用大量的條件判斷來處理不同職業和等級範圍下的技能點數計算。對於每個等級範圍,程式碼會計算基礎技能點數,然後根據剩餘等級增加技能點數。程式碼採用貪心策略,盡可能地利用每個等級範圍內的技能點數增長。

複雜度分析

  • 時間複雜度: O(N),其中 N 是輸入的等級數。因為程式碼對每個輸入的等級進行處理,主要的操作是 while 迴圈,其迭代次數與等級的差值有關,但整體上與輸入數量成線性關係。
  • 空間複雜度: O(1),程式碼只使用了少數幾個變數來存儲等級、職業和技能點數,空間使用是固定的,不隨輸入大小變化。

程式碼

#include <iostream>

using namespace std;

int main(){
	
	int a=0,b=0,ans=0;
	while(cin >> a >> b){
		if(a==0){
			cout << 0 << endl;
		}
		else if(a==1||a==3||a==4){
			if(b>=10&&b<30){
				ans++;
				while(b>10){
					b--;
					ans+=3;
				}
			}
			else if(b>=30&&b<70){
				ans+=62;
				while(b>30){
					b--;
					ans+=3;
				}
			}
			else if(b>=70&&b<120){
				ans+=183;
				while(b>70){
					b--;
					ans+=3;
				}
			}
			else{
				ans+=336;
				while(b>120){
					b--;
					ans+=3;
				}
			}
			cout << ans << endl;
			ans=0;
		}
		else if(a==2){
			if(b>=8&&b<30){
				ans++;
				while(b>8){
					b--;
					ans+=3;
				}
			}
			else if(b>=30&&b<70){
				ans+=68;
				while(b>30){
					b--;
					ans+=3;
				}
			}
			else if(b>=70&&b<120){
				ans+=189;
				while(b>70){
					b--;
					ans+=3;
				}
			}
			else{
				ans+=342;
				while(b>120){
					b--;
					ans+=3;
				}
			}
			cout << ans << endl;
			ans=0;
		}
	}
	
}

Discussion