问题的暴力解法:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int record=0;
int output=0;
long num;
long k=0;
in.nextLine();
long mid;
while(n-->0){
long min=in.nextLong();
long max=in.nextLong();
System.out.print(min+" "+max+" ");
if(max<min){
mid=min;
min=max;
max=mid;
}
output=0;
for(num=min;num<=max;num++){
k=num;
if(num*2<max){
continue;
}
for(record=0;k!=1;) {
if(k%2==0){
k=k/2;
record++;
}else{
k=k*3+1;
record++;
}
}
if (record>output)
output=record;
}
System.out.println(output+1);
}
}
}
暴力解法再要求下100%超时,想到用hashMap存储已经计算过的数字,代码不写了,但是:超时。hashMap的读取效率低于数组直接读取,下面是使用数组打表的代码,顺利通过时间测试:
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] test = new int[10000001];
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int record=0;
int output=0;
long num;
long k=0;
in.nextLine();
long mid;
while(n-->0){
long min=in.nextLong();
long max=in.nextLong();
System.out.print(min+" "+max+" ");
if(max<min){
mid=min;
min=max;
max=mid;
}
output=0;
for(num=min;num<=max;num++){
k=num;
if(num*2<max){
continue;
}
for(record=0;k!=1;) {
if(num<=1000000&&test[(int) num]!=0){
record+=test[(int)num];
break;
}
if(k%2==0){
k=k/2;
record++;
}else{
k=k*3+1;
record++;
}
}
if(num<=1000000)
test[(int) num]=record;
if (record>output)
output=record;
}
System.out.println(output+1);
}
}
}