問題的暴力解法:
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);
}
}
}