1. 程式人生 > 其它 >華為機試題目--《工單排程策略》

華為機試題目--《工單排程策略》

華為機試題目--《工單排程策略》

之所以寫這個部落格是因為這道題沒做出來,但是機試結束後來了思路,但已經沒辦法驗證。。有點遺憾。。所以希望後面有人遇到並搜到這個部落格的話麻煩告知一下能否通過(目前沒辦法確保通過),有通過的大佬也麻煩看下這個思路有沒有問題。為了保證公平在收到回覆後會主動刪掉這個帖子。

題目:

  當小區通訊裝置上報告警時,系統會自動生成待處理的工單,華為工單排程系統需要根據不同的策略,排程外線工程師(FME)上站去修復工單對應的問題。
  根據與運營商簽訂的合同,不同嚴重程度的工單被處理並修復的時長要求不同,這個要求被修復的時長我們稱之為SLA時間。假設華為和運營商A簽訂了運維合同,部署了一套排程系統,只有1個外線工程師(FME),每個工單根據問題嚴重程度會給一個評分,在SLA時間內完成修復的工單,華為獲得工單評分對應的積分,超過SLA完成的工單不獲得積分,但必須完成該工單。運營商最終會根據積分進行付款。
   請你設計一種排程策略,根據現狀得到排程結果完成所有工單,讓這個外線工程師處理的工單獲得的總積分最多。假設從某個排程時刻開始,當前工單數量為N,不會產生新的工單,每個工單處理修復耗時為1小時,請設計你的排程策略,完成業務目標。不考慮外線工程師在小區之間行駛的耗時。 假設有7個工單的SLA時間(小時)和積分如下:

測試樣例

7
1 6
1 7
3 2
3 1
2 4
2 5
6 1

思路就是先排序再使用優先佇列遍歷,後面的如果比前面的好就替換掉前面的。重點:如果到了第二個if處,說明此時的arr[i][0]是重複的,如果此時的分數(arr[i][1])比之前得到的某個分數要高,那麼就用這個分數替換掉之前的分數。總體的思想就是:後面的可以放在前面做,但前面的不能放在後面做,後面的如果分數比前面的高,就可以放在前面來做。

題解

public class LcTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] arr = new int[n][2];
        for(int i = 0;i<n;i++){
            arr[i][0] = sc.nextInt();
            arr[i][1] = sc.nextInt();
        }
        Arrays.sort(arr, (a,b) -> a[0] == b[0] ? b[1]-a[1] : a[0]-b[0]);
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for (int i = 0; i < arr.length; i++) {
            if (pq.size() < arr[i][0]) {
                pq.add(arr[i][1]);
                continue;
            }
            if (arr[i][1] > pq.peek()) {
                pq.poll();
                pq.add(arr[i][1]);
            }
        }
        int res = 0;
        while(!pq.isEmpty()) {
            res += pq.poll();
        }
        System.out.println(res);
    }

}