思路是用minheap来储存人数为0和1的桌子。这样对于每个人,可实现O(logn)获取下张可用的桌子。 总时间复杂度为O(logN)。 Note:数据量过大时,在输出结果的时候,如果每次都用System.out.println则会花费大量的时间,可能会造成超时。解决方法是用String Builder先获取总的输出字符串,最后输出这个字符串。
import java.util.Scanner;
import java.util.Queue;
import java.util.PriorityQueue;
class Person{
int pos;
boolean isMale;
Person(int p, boolean m){
pos = p;
isMale = m;
}
}
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int tableCount = 0;
int personCount = 0;
Person[] person = null;
int[] table = null;
for(int i = 0; i < n; i++){
tableCount = scan.nextInt();
table = new int[tableCount];
String tmp = scan.next();
char[] tmpArr = tmp.trim().toCharArray();
for(int j = 0; j < tableCount; j++){
//System.out.print(j);
table[j] = tmpArr[j] - '0';
}
personCount = scan.nextInt();
person = new Person[personCount];
tmp = scan.next();
tmpArr = tmp.trim().toCharArray();
for(int j = 0; j < personCount; j++){
person[j] = new Person(j, tmpArr[j]=='M');
}
findPos(table, person);
StringBuilder strb = new StringBuilder();
for(int j = 0; j < personCount; j++){
strb.append(person[j].pos + 1 + "\n");
}
strb.deleteCharAt(strb.length() - 1);
System.out.println(strb.toString());
}
}
public static void findPos(int[] table, Person[] person){
Queue<Integer> emptyPos = new PriorityQueue<>();
Queue<Integer> onePos = new PriorityQueue<>();
for(int i = 0; i < table.length; i++){
if(table[i] == 0) {
emptyPos.offer(i);
}
else if(table[i] == 1) onePos.offer(i);
}
for(int i = 0; i < person.length; i++){
if(person[i].isMale){
int pos = 0;
if(onePos.size() > 0){
person[i].pos = onePos.poll();
}
else{
pos = emptyPos.poll();
person[i].pos = pos;
onePos.offer(pos);
}
}
else{
int pos = 0;
if(emptyPos.size() > 0){
pos = emptyPos.poll();
onePos.offer(pos);
person[i].pos = pos;
}
else{
person[i].pos = onePos.poll();
}
}
}
}
}