【排序】连线游戏

  连线游戏

【问题描述】

  佳佳最近发明了一个游戏,来考验自命不凡的津津。游戏开始的时候,佳佳会给津津一块画着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.



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值