判断的时候可以将片段排序,然后依次判断三个连续数是否满足三角形的构成(两小边之和大于最大边)
如果每次都达到不符合的边界条件(a+b=c),如果以最小计算,从1,1,2开始,后面会构成斐波那契数列,当达到第48项时超出了int的最大值,所以当一个片段长度大于等于47时,则一定存在可构成三角形的三个数。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n= in.nextInt();
int[] weapon = new int[n];
for(int i=0;i<n;i++){
weapon[i]=in.nextInt();
}
int m = in.nextInt();
int count =0;
for(int i=0;i<m;i++){
int l=in.nextInt(),r=in.nextInt();
if(r-l+1>=47){count++;}//斐波那契数列
else if(r-l+1<3){continue;}//区间小于3
else{
if(triangle(l,r,weapon)){
count++;
}
}
}
System.out.println(count);
}
public static boolean triangle(int l,int r,int[] weapon){//检测是否能构成
//把l到r 片段取出并排序
int[] temp = new int[r-l+1];
for(int i=l,j=0;i<=r;i++,j++){temp[j]=weapon[i-1];}
Arrays.sort(temp);
//判断是否构成三角形
for(int i=0;i<r-l-1;i++){
if(temp[i]+temp[i+1]>temp[i+2]){
return true;
}
}
return false;
}
}



京公网安备 11010502036488号