天天看點

COGS 137. [USACO Feb08] 連線遊戲 137. [USACO Feb08] 連線遊戲

137. [USACO Feb08] 連線遊戲

★☆   輸入檔案:

lines.in

   輸出檔案:

lines.out

    簡單對比

時間限制:1 s   記憶體限制:16 MB

Farmer John最近發明了一個遊戲,來考驗自命不凡的貝茜。遊戲開始的時候,FJ會給貝茜一塊畫着N (2 <= N <= 200)個不重合的點的木闆,其中第i個點的橫、縱坐标分别為X_i和Y_i (-1,000 <= X_i <=1,000;-1,000 <= Y_i <= 1,000)。

貝茜可以選兩個點畫一條過它們的直線,當且僅當平面上不存在與畫出直線平行的直線。遊戲結束時貝茜的得分,就是她畫出的直線的總條數。為了在遊戲中勝出,貝茜找到了你,希望你幫她計算一下最大可能得分。

程式名: lines

輸入格式:

  • 第1行: 輸入1個正整數:N
  • 第2..N+1行: 第i+1行用2個用空格隔開的整數X_i、Y_i,描述了點i的坐标
輸入樣例 (lines.in):
4
-1 1
-2 0
0 0
1 1
      
輸出格式:
  • 第1行: 輸出1個整數,表示貝茜的最大得分,即她能畫出的互不平行的直線數
輸出樣例 (lines.out):
4
      

輸出說明:

貝茜能畫出以下4種斜率的直線:-1,0,1/3以及1。

這道題好坑,在SET中-0和0屬于倆個數字被這個坑了好長時間(這題還可以用向量寫判斷是否相等即平行)

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <cmath>

#include <set>

using namespace std;

set<double>s;

const int N = 21000;

double x[N], y[N];

int main()

{

    freopen("lines.out","w",stdout);

    freopen("lines.in","r",stdin);

    int n;

    while(~scanf("%d",&n))

    {

        s.clear();

        int cnt=0;

        for(int i=0;i<n;i++)

        {

            scanf("%lf %lf", &x[i], &y[i]);

        }

        int flag=0;

        for(int i=0;i<n;i++)

        {

            for(int j=i+1;j<n;j++)

            {

                double h;

                if(fabs(x[i]-x[j])<0.0000000000001)

                {

                    flag=1;

                }

                else

                {

                    h=(1.00000000000000000)*(y[i]-y[j])/(x[i]-x[j]);

                    //printf("%.9f\n",h);

                    if(fabs(y[i]-y[j])<0.0000000000001)

                        h=0;

                    if(!s.count(h))

                    {

                        s.insert(h);

                        cnt++;

                    }

                    else

                        continue;

                }

            }

        }

        if(flag==1)

        {

            cnt+=1;

        }

        cout<<cnt<<endl;

    }

    return 0;

}

繼續閱讀