猿輔導課堂上老師提供了一些角色,學生可以從中選擇一個自己喜歡的角色扮演,每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;
}
}