标签:
轰炸(BOMB)
源程序名 bomb.??? (pas,c,cpp)
可执行文件名 bomb.exe
输入文件名 bomb.in
输出文件名 bomb.out
时限 2s
“我该怎么办?”飞行员klux向你求助。
事实上,klux面对的是一个很简单的问题,但是他实在太菜了。
klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
输入:
输入数据由n对整数组成(1<n<700),每对整数表示一个点的坐标。没有一个点会出现两次。
输出:
一个整数,表示一条直线能覆盖的最多的点数。
样例:
bomb.in
1 1
2 2
3 3
9 10
10 11
bomb.out
3
说明:
本题翻译并改编自uva270,数据及解答由uva提供。
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: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; begin assign(input,‘bomb.in‘); assign(output,‘bomb.out‘); reset(input); rewrite(output); readln(n); if n<=2 then begin writeln(n); halt; end; for i:=1 to n do readln(a[i].x,a[i].y); 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); close(input); close(output); end.
使用枚举,横,竖,斜(k)。
标签:
原文地址:http://www.cnblogs.com/liuxinyu/p/4889520.html