首页 > 代码库 > 1610: [Usaco2008 Feb]Line连线游戏

1610: [Usaco2008 Feb]Line连线游戏

1610: [Usaco2008 Feb]Line连线游戏

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1396  Solved: 615
[Submit][Status]

Description

Farmer John最近发明了一个游戏,来考验自命不凡的贝茜。游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i个点 的横、纵坐标分别为X_i和Y_i (-1,000 <= X_i <=1,000; -1,000 <= Y_i <= 1,000)。 贝茜可以选两个点画一条过它们的直线,当且仅当平面上不存在与画出直线 平行的直线。游戏结束时贝茜的得分,就是她画出的直线的总条数。为了在游戏 中胜出,贝茜找到了你,希望你帮她计算一下最大可能得分。

Input

* 第1行: 输入1个正整数:N

 * 第2..N+1行: 第i+1行用2个用空格隔开的整数X_i、Y_i,描述了点i的坐标

Output

第1行: 输出1个整数,表示贝茜的最大得分,即她能画出的互不平行的直线数

Sample Input

4

-1 1

-2 0

0 0

1 1

Sample Output

* 第1行: 输出1个整数,表示贝茜的最大得分,即她能画出的互不平行的直线数



HINT

4 输出说明: 贝茜能画出以下4种斜率的直线:-1,0,1/3以及1。

Source

Silver

没啥好说的:直接求出所有斜率然后排序(特别注意斜率为正无穷,或者说是斜率不存在的情况)

 

 1 var 2    i,j,k,l,m,n:longint; 3    a:array[0..100000,1..2] of extended; 4    b:array[0..1000,1..2] of longint; 5 procedure swap(var x,y:extended); 6           var z:extended; 7           begin 8                z:=x;x:=y;y:=z; 9           end;10 11 procedure sort(l,r,z:longint);12           var13              i,j:longint;14              x:extended;15           begin16                i:=l;17                j:=r;18                x:=a[(l+r) div 2,z];19                repeat20                      while a[i,z]<x do inc(i);21                      while x<a[j,z] do dec(j);22                      if i<=j then23                         begin24                              swap(a[i,z],a[j,z]);25                              swap(a[i,3-z],a[j,3-z]);26                              inc(i);dec(j);27                         end;28                until i>j;29                if i<r then sort(i,r,z);30                if l<j then sort(l,j,z);31           end;32 33 34 begin35      readln(n);36      for i:=1 to n do37          begin38               readln(b[i,1],b[i,2]);39          end;40 41      m:=0;42      for i:=1 to n do43          for j:=i+1 to n do44              begin45                   inc(m);46                   if b[i,1]=b[j,1] then47                      begin48                           a[m,2]:=1;49                           a[m,1]:=0;50                      end51                   else52                       begin53                            a[m,2]:=0;54                            a[m,1]:=(b[j,2]-b[i,2])/(b[j,1]-b[i,1]);55                       end;56              end;57 58      sort(1,m,2);59      l:=m;60      while a[l,2]=1 do dec(l);61      sort(1,l,1);62 63      if l<=1 then64         begin65              if l=m then writeln(l) else writeln(l+1);66              halt;67         end;68      j:=1;69      k:=1;70      for i:=2 to l do71          begin72               if a[i,1]<>a[j,1] then73                  begin74                       inc(k);75                       j:=i;76                  end;77          end;78      if l=m then writeln(k) else writeln(k+1);79 end.

 

1610: [Usaco2008 Feb]Line连线游戏