poj 2606 Rabbit hunt

题目

给你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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值