zoukankan      html  css  js  c++  java
  • 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           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.
  • 相关阅读:
    自动机
    C语言文法
    实验报告一:词法分析
    Python的基础综合练习
    Python基础综合练习
    turtle画五星红旗
    熟悉常用的Linux操作
    大数据概述
    对学习编译原理的看法
    LINUX
  • 原文地址:https://www.cnblogs.com/HansBug/p/4163005.html
Copyright © 2011-2022 走看看