題目:
勇士打怪獸
題解:
總體思路:
從小到大排序,遇到能打過的+1,遇到打不過的升級,記錄金幣的最大值。
具體思路:
1. 先對所有怪獸的能力值數組進行排序,從弱的開始打;
2. 遍歷排序後的所有怪獸,如果能力值夠打,就打完拿 1 金幣;
3. 如果當前金幣+能力值夠打,就打完拿 1 金幣(金幣和能力值進行更新);
4. 用一個值記錄最大金幣,每次用金幣補貼之前先更新最大值;
5. 打印最大金幣數;
代碼:
import java.util.*;
public class Main_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt())
{
int a = sc.nextInt(); // 勇士能力值 a
int n = sc.nextInt(); // 怪獸個數 n
int index = 0; // 數組下標 index
int count = 0; // 金幣數 count
int x[] = new int[n];
for(int i = 0; i < n; i++)
{
x[i] = sc.nextInt(); // n個數,分別代表怪獸的能力值 x[i]
}
Arrays.sort(x); // 先對所有怪獸的能力值數組進行排序,從弱的開始打
for(int i = 0; i < n; i++)
{
if(a >= x[i]) // 遍歷排序後的所有怪獸,如果能力值夠打,就打完拿 1 金幣
{
count++;
index = i;
}
}
int cnt = count; // 金幣數 cnt
int max = count; // 最大金幣數 max
int res; // 每個怪獸的能力值 x[i] - 勇士能力值 a == res(差值)
for(int i = index + 1; i < n; i++)
{
if(cnt + n < x[i])
{
break;
}
else // 如果當前金幣+能力值夠打,就打完拿 1 金幣(金幣和能力值進行更新)
{
res = x[i] - a;
a = a + res;
cnt = cnt - res;
}
if(a >= x[i])
{
cnt++;
}
if(cnt > max) // 用一個值記錄最大金幣,每次用金幣補貼之前先更新最大值
{
max = cnt;
}
}
System.out.println(max); // 打印最大金幣數
}
}
}
// 輸入:
// 1 3
// 2 2 1
// 輸出:
// 2