题解 | #山寨金闪闪#
山寨金闪闪
https://www.nowcoder.com/practice/9363dcb83ca44c61a2c1a8f65aa722b8
判断的时候可以将片段排序,然后依次判断三个连续数是否满足三角形的构成(两小边之和大于最大边)
如果每次都达到不符合的边界条件(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; } }