码迷,mamicode.com
首页 > 其他好文 > 详细

bomb

时间:2015-10-18 15:14:32      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

轰炸(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)。

 

bomb

标签:

原文地址:http://www.cnblogs.com/liuxinyu/p/4889520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!