Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 24071 | Accepted: 7564 |
Description
"How am I ever going to solve this problem?" said the pilot.
Indeed, the pilot was not facing an easy task. She had to drop packages at specific points scattered in a dangerous area. Furthermore, the pilot could only fly over the area once in a straight line, and she had to fly over as many points as possible. All points were given by means of integer coordinates in a two-dimensional space. The pilot wanted to know the largest number of points from the given set that all lie on one line. Can you write a program that calculates this number?
Your program has to be efficient!
Indeed, the pilot was not facing an easy task. She had to drop packages at specific points scattered in a dangerous area. Furthermore, the pilot could only fly over the area once in a straight line, and she had to fly over as many points as possible. All points were given by means of integer coordinates in a two-dimensional space. The pilot wanted to know the largest number of points from the given set that all lie on one line. Can you write a program that calculates this number?
Your program has to be efficient!
Input
Input consist several case,First line of the each case is an integer N ( 1 < N < 700 ),then follow N pairs of integers. Each pair of integers is separated by one blank and ended by a new-line character. The input ended by N=0.
Output
output one integer for each input case ,representing the largest number of points that all lie on one line.
Sample Input
5 1 1 2 2 3 3 9 10 10 11 0
Sample Output
3
Source
THINKING
搜索,分别判断X轴,Y轴,斜率即可。
type point=record x,y:longint; end; var a:array[0..5000] of point; f:array[0..5000] of longint; i,j,ans,sum,pred,n,xx,yy,g,k,aa,bb,x:longint; function max(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end; procedure sort(l,r: longint); var i,j,x: longint;y:point; begin i:=l; j:=r; x:=a[(l+r) div 2].x; repeat while a[i].x<x do inc(i); while x<a[j].x do dec(j); if not(i>j) then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; inc(i); j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; procedure sort1(l,r: longint); var i,j,x: longint;y:point; begin i:=l; j:=r; x:=a[(l+r) div 2].y; repeat while a[i].y<x do inc(i); while x<a[j].y do dec(j); if not(i>j) then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; inc(i); j:=j-1; end; until i>j; if l<j then sort1(l,j); if i<r then sort1(i,r); end; procedure main; begin if n<=2 then begin writeln(n); halt; end; if n=3 then if(abs(a[2].x-a[1].x)=abs(a[3].x-a[2].x))and(abs(a[2].y-a[1].y)=abs(a[3].y-a[2].y)) then begin writeln(3); halt; end else begin writeln(2); halt; end; //特殊判断 sort(1,n); ans:=0; sum:=1; pred:=a[1].x; for i:=2 to n do if a[i].x=pred then inc(sum) else begin ans:=max(ans,sum); pred:=a[i].x; sum:=1; end; //判断横 ans:=max(ans,sum); sort1(1,n); sum:=1; pred:=a[1].y; for i:=2 to n do if a[i].y=pred then inc(sum) else begin ans:=max(ans,sum); pred:=a[i].y; sum:=1; end; //判断纵 ans:=max(ans,sum); for i:=1 to n do for j:=i+1 to n do begin sum:=2; for k:=j+1 to n do begin aa:=(a[i].y-a[k].y)*(a[j].x-a[k].x); bb:=(a[i].x-a[k].x)*(a[j].y-a[k].y); if aa=bb then inc(sum); end; ans:=max(ans,sum); end; //判断斜率 writeln(ans); end; begin while true do begin readln(n); if n=0 then halt; for i:=1 to n do readln(a[i].x,a[i].y); main; end; end.
来源:https://www.cnblogs.com/yangqingli/p/4889105.html