牛客--分組對話

猿輔導課堂上老師提供了一些角色,學生可以從中選擇一個自己喜歡的角色扮演,每3個不同的角色就可以組成一個小組,進行分組對話。
當老師點擊開始分組對話按鈕的時候,服務器會爲已經選擇自己角色的同學分配對話小組,請問最多能組成多少個對話小組?

輸入描述:
第一行爲測試用例數量C(C<=100),接下來的C行每行爲一個測試用例

每個用例的第一個數字表示可供選擇的角色數量T(T<=1000),接下來的T個數字表示每個角色的選擇人數Pi(Pi<=500)

輸出描述:
一共C行,每行表示一個測試用例中的最大對話小組數量。
示例1
輸入
3
3 1 1 1
3 2 2 3
4 0 2 3 99
輸出
1
2
2
說明
對於用例1,正好3個不同角色,每個角色1個人選,於是構成且只能構成一個小組。

對於用例2,在構成兩個小組之後,第3個角色單了1人無法構成任何小組,所以最大小組數量是2。

對於用例3,學生扎堆選擇了最後一個角色,但是第二個角色只有2個人,所以還是隻能構成2個對話小組。


自己的做法: 將最大的三堆 提出,然後 減去 這三堆中最小的,(直接降爲0)

實際上大錯特錯: 這樣就直接減少了一個分組,導致最後,很容易造成 湊不成 3個不同的角色組成一個小組。

正解: 利用優先隊列 每次從人數最多的三個角色出各取一人 組成一組,然後再放回 優先隊列中,(保證每一次都是從人數最多的三個角色出各取一人) 這樣保證使其最後的角色人數爲(1,1,1) 而不是 (3,0,0)這種情況。

import java.util.PriorityQueue;
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner input;
        int C, T, i, j;
        int[][] P;
 
        input = new Scanner(System.in);
        C = input.nextInt();
        P = new int[C][];
        for(i = 0; i < C; i++){
            T = input.nextInt();
            P[i] = new int[T];
            for(j = 0; j < T; j++){
                P[i][j] = input.nextInt();
            }
        }
        for(i = 0; i < C; i++){
            System.out.println(solve(P[i]));
        }
        input.close();
    }
 
    private static int solve(int[] P){
        int first, second, third, ans = 0;
        
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a,b)-> b-a);
        
        for(int p : P) {
        	if(p > 0)pq.offer(p);
        }
        
        while(pq.size() > 2){
            first = pq.poll();
            second = pq.poll();
            third = pq.poll();
            if(--first > 0){
                pq.offer(first);
            }
            if(--second > 0){
                pq.offer(second);
            }
            if(--third > 0){
                pq.offer(third);
            }
            ans++;
        }
        return ans;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章