题目
给你n个点,求最多有多少点共线
题解
直接暴力枚举两个点,每次都判断与这两点共线的点有多少,然后更新最大值。
判断两点是否在同一直线上:
m=((x2-x0)(y1-y0))-((x1-x0)(y2-y0))
m=0则是
剪枝
当共线点数已经超过n一半时,将这次的答案输出,不再枚举。原因很简单
时间复杂度O(n3)
代码
var
n,i,j,k,t,ans:longint;
a:array[1..200,1..2]of longint;
function m(x0,y0,x1,y1,x2,y2:longint):longint;
begin
m:=((x2-x0)*(y1-y0))-((x1-x0)*(y2-y0));
end;
begin
readln(n);
for i:=1 to n do
readln(a[i,1],a[i,2]);
for i:=1 to n do
for j:=1 to n do
if i<>j then
begin
t:=0;
for k:=1 to n do
if (m(a[i,1],a[i,2],a[j,1],a[j,2],a[k,1],a[k,2])=0) then inc(t);
if t>ans then ans:=t;
if t>n div 2 then begin writeln(ans);exit;end;
end;
writeln(ans);
end.