4.20日阿里筆試

題目:

勇士打怪獸
在這裏插入圖片描述
在這裏插入圖片描述

題解:

總體思路:
從小到大排序,遇到能打過的+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

參考:

  1. 阿里筆試記錄(4.20場)
  2. 阿里巴巴筆試4/20 實習生
  3. 阿里筆試 4月20日 Python
  4. C/C++代碼
  5. 阿里筆試4/20場c++
  6. 阿里 4/20 筆試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章