阿里筆試題-城堡問題
阿新 • • 發佈:2019-02-15
這個題目我兩次筆試都遇到了,貼出來紀念一下吧。。。歡迎指正
【8月22:發現有問題,需要重新修改】
將軍大勝歸來, 奪取很多城堡(xi, yi)。國王向將軍許諾, 你站在任意的城堡上, 選擇任意角度,看得見的城堡都是你的,包括你站的城堡,但頭不能動但。而且不能站在城堡構成的凸集點上。 將軍的視角剛好小於180度(無限接近180度), 可以看得無限遠。 請幫忙計算出將軍最多能得到多少城堡。如果所有的城堡都在凸集點上,那麼將軍一個城堡也得不到。
輸入範例:
10
1
1
-1
1
-1
-1
1
-1
0
0
輸出範例:
3
/**
* Created by MKD on 2017/8/21.
* 思路是不斷的利用兩個點連線,獲取能夠取得的最大點,並排除凸點情況
*/
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int res;
int _points_size = 0;
_points_size = Integer.parseInt(in.nextLine().trim());
double[] _points = new double[_points_size];
double _points_item;
for(int _points_i = 0; _points_i < _points_size; _points_i++) {
_points_item = Double.parseDouble(in.nextLine().trim());
_points[_points_i] = _points_item;
}
res = castle(_points);
System.out.println(String.valueOf(res));
}
static int castle(double[] points) {
int len = points.length;
int result = 0;
if(len<=8) return 0;
else{
for (int j=0;j<len/2 ;j++){
double x1 = points[2*j];
double y1 = points[2*j+1];
for(int k=0;k<len/2;k++){
if(k==j) continue;
double x2 = points[2*k];
double y2 = points[2*k+1];
double w= getw(x1,y1,x2,y2);
double b = getb(x1,y1,x2,y2);
int r= getMax(j,k,len,w,b,points);
if(r>result) result=r;
}
}
}
return result;
}
public static Double getw(double x1, double y1, double x2, double y2){//計算w
double w = (x1-x2)/(y1-y2);
return w;
}
public static Double getb(double x1, double y1, double x2, double y2){//計算b
double w = (x1-x2)/(y1-y2);
double b = y1 - x1*w;
return b;
}
public static int getMax(int j,int k,int len,double w,double b,double[] points){//尋找最多的城堡
int n0=0;int n1=0;int n2=0;
int result=0;
for(int i=0;i<len/2;i++) {
if (i == j || i == k) continue;
double x = points[2 * i];
double y = points[2 * i + 1];
double re = y - w * x + b;
if (re > 0) n1 = n1 + 1;
else if (re < 0) n2 = n2 + 1;
else n0 = n0 + 1;
}
result = Math.max((n0+n1),(n2+n0));
if(result == len/2 - 2) return 0;//如果加上連線上除開連線的兩個點,數量為total-2,那麼一定是凸點
else return result+1;//排除凸點後,總數再加上本身點,固 + 1
}
}