51NOD斜率最大平面上有N个点,任意2个点确定一条直线,求出所有这些直线中,斜率最大的那条直线所通过的两个点。

时间:2021-01-25 14:38:48

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 }