不平行的直线
题目描述
在坐标纸上有N个不重合的点,两两可以连一个线段并延伸成直线,请问在这些直线里最多能选出多少条使得他们两两不平行也不重合。
输入描述:
第1行: 输入1个正整数:N
第2..N+1行:第i+1行是两个用空格隔开的整数,为点i的坐标(Xi,Yi)
输出描述:
输出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- 阅读(261) 评论(0) 编辑 收藏 举报