• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

serendipityx

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

不平行的直线

 

题目描述

在坐标纸上有N个不重合的点,两两可以连一个线段并延伸成直线,请问在这些直线里最多能选出多少条使得他们两两不平行也不重合。

 

 

 

输入描述:

第1行: 输入1个正整数:N

第2..N+1行:第i+1行是两个用空格隔开的整数,为点i的坐标(Xi,Yi)

输出描述:

输出1个整数,为最多的互不平行的直线数目。
示例1

输入

复制
3
1 0
-2 0
0 0

输出

复制
1

备注:

 

N≤200,−1000≤Xi​,Yi​≤1000

 

思路:枚举出所有的斜率,用set去重,注意用double类型

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e6;
double marr[maxn];
struct point
{
    double x;
    double y;
}arr[205];

double gradient(double x,double y,double w,double v)
{
    double ans;
    if(x==w)
    {
        ans=INF;
    }
    else
        ans=(y-v)/(x-w);
    return ans;
}

int main()
{
    int n; cin>>n;
    int i,j,k=0;
    for(i=0;i<n;i++)
        cin>>arr[i].x>>arr[i].y;
    for(i=0,j=1;i<=j&&j<n;)
    {
        marr[k++]=gradient(arr[i].x,arr[i].y,arr[j].x,arr[j].y);
        if(j==n-1)
        {
            i++;j=i+1;
        }else j++;
    }
    set<double>s(marr,marr+k);
    cout<<s.size()<<endl;
    return 0;
}

 

posted on 2020-05-27 23:31  Adventurer-  阅读(269)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3