题目:现有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回 答Q个问题。每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上 写着x。排序后的大理石从左到右编号为1~N。(在样例中,为了节约篇幅,所有大理石上 的数合并到一行,所有问题也合并到一行。)
思路:读入的第一个数为有多少个大理石,第二个数为需要查找大理石的个数;将大理石的上的数字存入在数组中,通过排序查找相应的位置。找到则输出位置,没找到就显示“not found”.
问题:一开始是用Arrays.sort方法排序,通过循环查找。但是一直TLE。
AC代码:
import java.util.*;
public class Main{
public static void main(String args[]){
@SuppressWarnings("resource")
Scanner in=new Scanner(System.in);
int kase=0;
while(in.hasNext()){
int a=in.nextInt(),b=in.nextInt();
if(a==0&&b==0) break;
kase++;
System.out.println("CASE# "+kase+":");
int[] num=new int[10001];
for(int i=0;i<a;i++){
int aa=in.nextInt();
num[aa]++;
}
for(int i=0;i<b;i++){
int aa=in.nextInt();
if(num[aa]==0) System.out.println(aa+" not found");
else {
int ans=0;
for(int j=0;j<aa;j++) ans+=num[j];
System.out.println(aa+" found at "+(ans+1));
}
}
}
}
}
TLE代码:
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner in=new Scanner(System.in);
int kase=0;
while(in.hasNext()){
int a=in.nextInt(),b=in.nextInt();
if(a==0&&b==0) break;
int[] aa=new int[a];
for(int i=0;i<a;i++){
aa[i]=in.nextInt();
}
Arrays.sort(aa);
kase++;
System.out.println("CASE# "+kase+":");
while(b-- >0){
int bb=in.nextInt();
boolean ok=false;
int t=0;
for(int i=0;i<a;i++){
t++;
if(aa[i]==bb){
ok=true;
break;
}
}
if(ok) System.out.println(bb+" found at "+t);
else System.out.println(bb+" not fount");
}
}
}
}