2020年牛客算法入门课练习赛1 不平行的直线 set去重
链接:https://ac.nowcoder.com/acm/contest/5773/B
来源:牛客网
题目描述
在坐标纸上有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≤1000N \leq 200,-1000 \leq X_i,Y_i \leq 1000N≤200,−1000≤Xi,Yi≤1000
就是问有多少种斜率,用 std::set自动去重就好了
scanf("%d ", &n);
for(int i=1; i<=n; i++) {
scanf("%lf %lf ", x+i, y+i);
}
set<double> seta;
int s = 0; //竖线情况
for(int i=1; i<=n; i++) {
for(int k=i+1; k<=n; k++) {
if(i != k) {
if(x[i] == x[k]) {
s = true;
continue ;
}
double xl = (y[k]-y[i])/(x[k]-x[i]);
seta.insert(xl);
}
}
}
printf("%d\n", seta.size()+s);