连线游戏
【问题描述】
佳佳最近发明了一个游戏,来考验自命不凡的津津。游戏开始的时候,佳佳会给津津一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i个点的横、纵坐标分别为Xi和Yi (-1,000 <= Xi <=1,000;-1,000 <= Yi <= 1,000)。
津津可以选两个点画一条过它们的直线,当且仅当平面上不存在与画出直线平行的直线。游戏结束时津津的得分,就是她画出直线的总条数。为了在游戏中胜出,津津找到了你,希望你帮她计算一下最大可能得分。
【文件输入】
文件输入的第一行为一个正整数N,表示木板上面点的个数,第二行到第n+1行每行两个整数Xi、Yi,表示每个点的坐标。
【文件输出】
文件输出只有一个整数,表示津津的最大得分,即她能画出互不平行直线的最多个数。
【样例输入】
4
-1 1
-2 0
0 0
1 1
【样例输出】
4
【输出说明】
津津能画出以下4种斜率的直线:-1,0,1/3以及1。
====================================
注意0的情况的讨论..
============================
type
node=record
//s,m:longint;
x:extended;
end;
var
n:longint;
x,y:array[1..200]of longint;
ans:array[1..40000]of node;
anss:longint;
procedure init;
begin
assign(input,'game.in');
assign(output,'game.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure qsort(s,t:longint);
var
x:extended;
tem:node;
i,j:longint;
begin
i:=s; j:=t;
x:=ans[(s+t)shr 1].x;
repeat
while x<ans[j].x do dec(j);
while ans[i].x<x do inc(i);
if i<=j then
begin
tem:=ans[i];
ans[i]:=ans[j];
ans[j]:=tem;
inc(i); dec(j);
end;
until i>j;
if i<t then qsort(i,t);
if s<j then qsort(s,j);
end;
procedure main;
var
i,j:longint;
anst:longint;
begin
readln(n);
for i:=1 to n do
readln(x[i],y[i]);
anss:=0;
for i:=1 to n do
for j:=1 to n do
if i<>j then
begin
if x[i]-x[j]=0 then
begin
inc(anss);
ans[anss].x:=300000;
//ans[anss].s:=y[i]-y[j];
//ans[anss].m:=x[i]-x[j];
end
else
begin
inc(anss);
ans[anss].x:=(y[i]-y[j])/(x[i]-x[j]);
//ans[anss].s:=y[i]-y[j];
//ans[anss].m:=x[i]-x[j];
end;
end;
qsort(1,anss);
anst:=1;
for i:=2 to anss do
if ans[i].x-ans[i-1].x>0.0000001 then inc(anst);
writeln(anst);
end;
begin
init;
main;
terminate;
end.