题目好像是这样的给出一组数据点,这些点都在圆上,给出每个点的距离正北方向的角度,角度为顺时针递增,求圆上的点最多可以组成多少个钝角三角形,下面看一下输入样例。
第一行 x 表示有 多少个点
第2行到n行为每个点到正北方向的角度。
输出 y 表示有最多有y 个钝角三角形
输入样例
4
0
180
179
45
输出样例
2
解题思路,由于根据数学知识可知圆上的点与直径组成的三角都为直角三角形,圆上任意三点在劣弧内,则构成钝角三角形,因为劣弧为小于半圆的长度,我可以采用二分思想,分步计算。
大家可以画图,找出规律。最后列出数学求解公式
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Integer n = null;
try {
n = Integer.parseInt(br.readLine());
List<Double> list2=new ArrayList<Double>();
for(int i=0;i<n;i++){
list2.add(Double.parseDouble(br.readLine()));
}
List<Double> list=new ArrayList<Double>();
//获取可以构成半径的点
for(int i=0;i<n;i++){
if(list2.get(i)>180){
break;
}
for(int j=i+1;j<n;j++){
if(list2.get(i)+180==list2.get(j)){
list.add(list2.get(i));
break;
}
}
}
int sum=0;//劣弧上的点的个数
int num=0;//其他点的个数
for(int i=0;i<list.size();i++){
double temp=list.get(i);
list2.remove(temp);
list2.remove(temp+180);
for(int j=0;j<list2.size();j++){
if(list2.get(j)>temp&&list2.get(j)<temp+180){
sum++;
}else{
num++;
}
}
}
int t1=0;
int t2=0;
for(int i=1;i<sum;i++){
t1+=i;
}
for(int i=1;i<num;i++){
t2+=i;
}
System.out.println(t1*2+t2*2);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}