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
没啥好说的:直接求出所有斜率然后排序(特别注意斜率为正无穷,或者说是斜率不存在的情况)
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 var 13 i,j:longint; 14 x:extended; 15 begin 16 i:=l; 17 j:=r; 18 x:=a[(l+r) div 2,z]; 19 repeat 20 while a[i,z]<x do inc(i); 21 while x<a[j,z] do dec(j); 22 if i<=j then 23 begin 24 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 begin 35 readln(n); 36 for i:=1 to n do 37 begin 38 readln(b[i,1],b[i,2]); 39 end; 40 41 m:=0; 42 for i:=1 to n do 43 for j:=i+1 to n do 44 begin 45 inc(m); 46 if b[i,1]=b[j,1] then 47 begin 48 a[m,2]:=1; 49 a[m,1]:=0; 50 end 51 else 52 begin 53 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 then 64 begin 65 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 do 71 begin 72 if a[i,1]<>a[j,1] then 73 begin 74 inc(k); 75 j:=i; 76 end; 77 end; 78 if l=m then writeln(k) else writeln(k+1); 79 end.