• [BZOJ1610] [Usaco2008 Feb] Line连线游戏 (set)


    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

    4

    HINT

      输出说明: 贝茜能画出以下4种斜率的直线:-1,0,1/3以及1。

    Source

      Silver

    Solution

      枚举两个点直接算,set去个重就好了。T T别告诉我你不会求斜率。

      哦我为了防止精度误差,用的是pair<int, int>表示斜率

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef pair<int, int> pii;
     4 set<pii> S;
     5 int x[1005], y[1005];
     6  
     7 int gcd(int i, int j)
     8 {
     9     return j ? gcd(j, i % j) : i;
    10 }
    11  
    12 int main()
    13 {
    14     int n, dx, dy, g;
    15     cin >> n;
    16     for(int i = 1; i <= n; i++)
    17         cin >> x[i] >> y[i];
    18     for(int i = 1; i <= n; i++)
    19         for(int j = i + 1; j <= n; j++)
    20         {
    21             dx = x[i] - x[j];
    22             dy = y[i] - y[j];
    23             g = gcd(dx, dy);
    24             dx /= g, dy /= g;
    25             S.insert(make_pair(dx, dy));
    26         }
    27     cout << S.size() << endl;
    28     return 0;
    29 }
    View Code
  • 相关阅读:
    反馈表单,JQUERY无刷新,数字验证
    漂亮的js删除确认提示框
    AJAX jQuery tab,动态加载选显卡
    获取系统变量的小小程序
    synchronized的用法简介
    代理模式之浅谈
    java生成可执行文件的方法总结
    设计模式之策略模式浅谈
    Android通过Socket(TCP/IP)与PC通讯
    JavaGUI编程简单介绍
  • 原文地址:https://www.cnblogs.com/CtrlCV/p/5525574.html
Copyright © 2020-2023  润新知