双指针
最后一个无法通过 卡输出
StringBuilder sb = new StringBuilder();
sb.append(输出的字符串)
System.out.print(sb);
要比println 输出效率高太多
import java.io.*; import java.util.Scanner; import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(new BufferedInputStream(System.in)); int t = sc.nextInt(); for(int k=0;k<t;k++){ int n = sc.nextInt(); sc.nextLine(); // 每桌的人数 table int[] table = new int[n]; String table_char = sc.nextLine(); for(int i=0;i<n;i++){ table[i] = table_char.charAt(i)-'0'; } int m = sc.nextInt(); sc.nextLine(); //排队 序列 que String que = sc.nextLine(); int pointM = 0; //指向1座位 int pointF = 0; //指向0座位 for(int i=0;i<m;i++){ if (que.charAt(i) == 'F'){ //寻找0,1座位 while(pointF<n && table[pointF]!=0 ) pointF++; while(pointM < n && table[pointM]!=1) pointM++; //没有0座位 if(pointF >= n) { table[pointM]++; System.out.println(pointM+1); } //有0座位 else { System.out.println(pointF+1); table[pointF]++; pointM = Math.min(pointM,pointF); } }else{ //寻找0,1座位 while(pointM < n && table[pointM]!=1) pointM++; while(pointF<n && table[pointF]!=0 ) pointF++; //没有一个人的 if(pointM >= n) { System.out.println(pointF+1); table[pointF]++; pointM = Math.min(pointM,pointF); //这里是取最小的 女性会增加1个座位的 //有1座位的 }else { System.out.println(pointM+1); table[pointM]++; } } } } } }
卡输出 每次 println 太费时间 输出改成buffer
import java.util.Scanner; import java.util.*; import java.io.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(new BufferedInputStream(System.in)); int t = sc.nextInt(); for(int k=0;k<t;k++){ int n = sc.nextInt(); sc.nextLine(); // 每桌的人数 table int[] table = new int[n]; String table_char = sc.nextLine(); for(int i=0;i<n;i++){ table[i] = table_char.charAt(i)-'0'; } int m = sc.nextInt(); sc.nextLine(); //排队 序列 que String que = sc.nextLine(); int pointM = 0; //指向1座位 int pointF = 0; //指向0座位 // 修改输出 StringBuilder sb = new StringBuilder(); for(int i=0;i<m;i++){ int seatsnum; if (que.charAt(i) == 'F'){ //寻找0座位 while(pointF<n && table[pointF]!=0 ) pointF++; //没有0座位 if(pointF >= n) { while(pointM < n && table[pointM]!=1) pointM++; table[pointM]++; seatsnum = pointM+1; } //有0座位 else { seatsnum = pointF+1; table[pointF]++; pointM = Math.min(pointM,pointF); } }else{ //寻找1座位 while(pointM < n && table[pointM]!=1) pointM++; //没有一个人的 if(pointM >= n) { while(pointF<n && table[pointF]!=0 ) pointF++; seatsnum = pointF+1; table[pointF]++; pointM = Math.min(pointM,pointF); //有1座位的 }else { seatsnum = pointM+1; table[pointM]++; } } sb.append(seatsnum).append("\n"); } System.out.print(sb); } } }