zju 1041 雷达覆盖

Description

以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的) 

这里写图片描述

Input

Output

题解

先把雷达不可能覆盖的点排除,每个点与中点都组成一个直线方程完后线性规划看其他的点在这条直线左边的inc(l)在右边的inc(r)在直线的inc(m),完后比较m+l与max的大小和r+m与max的大小。这题就完了。

代码

var
  xn,yn,n,num:longint;
  rn:real;
  x,y:array [0..1001] of longint;
procedure init;
var
  i,xx,yy,nn:longint;
begin
  n:=0;
  readln(xn,yn,rn);
  if rn<=0 then halt;
  readln(nn);
  for i:=1 to nn do
    begin
      readln(xx,yy);
      if sqrt(sqr(xx-xn)+sqr(yy-yn))<=rn then
        begin
          inc(n);
          x[n]:=xx; y[n]:=yy;
        end;
    end;
end;

function max(o,p:longint):longint;
begin
  if o>p then exit(o);
  exit(p);
end;

procedure main;
var
  i,j,r,l,m:longint;
begin
  num:=0;
  for i:=1 to n do
    begin
      r:=0; l:=0; m:=0;
      for j:=1 to n do
        begin
          if (x[i]-xn)*(y[j]-yn)-(x[j]-xn)*(y[i]-yn)=0 then inc(m);
          if (x[i]-xn)*(y[j]-yn)-(x[j]-xn)*(y[i]-yn)<0 then inc(r);
          if (x[i]-xn)*(y[j]-yn)-(x[j]-xn)*(y[i]-yn)>0 then inc(l);
        end;
      num:=max(max(num,m+r),m+l);
    end;
end;

begin
  while 1=1 do
    begin
      init;
      main;
      writeln(num);
    end;
end.
posted @ 2016-09-03 08:12  猪都哭了  阅读(139)  评论(0编辑  收藏  举报