51NOD斜率最大平面上有N个点,任意2个点确定一条直线,求出所有这些直线中,斜率最大的那条直线所通过的两个点。
1 package com.lionel.test; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.Collection; 5 import java.util.Comparator; 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.List; 9 import java.util.Map; 10 import java.util.Scanner; 11 import java.util.Set; 12 import java.util.TreeSet; 13 /** 14 * 平面上有N个点,任意2个点确定一条直线,求出所有这些直线中,斜率最大的那条直线所通过的两个点。 15 *(点的编号为1-N,如果有多条直线斜率相等,则输出所有结果,按照点的X轴坐标排序,正序输出。 16 * 数据中所有点的X轴坐标均不相等) 17 * 18 * */ 19 public class Temp5 { 20 public static void main(String[] args) { 21 Scanner in=new Scanner(System.in); 22 String str=in.nextLine(); 23 int len=Integer.parseInt(str); 24 Integer []xArr=new Integer[len]; 25 Integer []yArr=new Integer[len]; 26 Map<Integer,Integer>map2=new HashMap<Integer, Integer>(); 27 for (int i = 0; i < len; i++) { 28 String [] s=in.nextLine().split(" "); 29 xArr[i]=Integer.parseInt(s[0]); 30 map2.put(Integer.parseInt(s[0]), i); 31 yArr[i]=Integer.parseInt(s[1]); 32 } 33 /* TreeSet<Double>set=new TreeSet<>(new Comparator<Double >() { 34 @Override 35 public int compare(Double d, Double d2) { 36 // TODO Auto-generated method stub 37 if (d2>d) { 38 return 1; 39 }else{ 40 return -1; 41 } 42 } 43 });*/ 44 double max=0; 45 Map<Double,Collection<Integer>>map=new HashMap<Double, Collection<Integer>>(); 46 for (int i = 0; i < len-1; i++) { 47 for (int j = i+1; j < len; j++) { 48 if (xArr[i]<xArr[j]) { 49 Integer temp=xArr[j]; 50 xArr[j]=xArr[i]; 51 xArr[i]=temp; 52 temp=yArr[j]; 53 yArr[j]=yArr[i]; 54 yArr[i]=temp; 55 } 56 } 57 } 58 List<Integer>list3=new ArrayList<Integer>(); 59 for (int i = 0; i < len-1; i++) { 60 for (int j = i+1; j < len; j++) { 61 if (xArr[i]>xArr[j]) { 62 63 double res=(yArr[i]-yArr[j])/((xArr[i]-xArr[j])*1.0); 64 if (res>max) { 65 list3.clear(); 66 list3.add(xArr[j]); 67 list3.add(xArr[i]); 68 max=res; 69 }else if(res==max){ 70 list3.add(xArr[j]); 71 list3.add(xArr[i]); 72 } 73 } 74 } 75 } 76 len=list3.size(); 77 for (int i = 0; i < len; i++) {//2 78 Integer te=list3.get(i); 79 for (int j = i+1; j < len; j++) { 80 if (te>list3.get(j)) { 81 te=list3.get(j); 82 } 83 } 84 if (i==0||i%2==1) { 85 System.out.print((map2.get(te)+1)+" "); 86 }else{ 87 System.out.print((map2.get(te)+1)); 88 System.out.println(); 89 } 90 } 91 92 } 93 }