不平行的直线

不平行的直线

https://ac.nowcoder.com/acm/contest/5773/B

链接:https://ac.nowcoder.com/acm/contest/5773/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
在坐标纸上有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

题解:
看到N<=200,那果断N^2~N^3复杂度.所以暴力出奇迹就好了呀。求所有线段斜率不一样就是一条,只要注意两点重合,斜率不存在两种情况就差不多了。当然后面斜率就是double类型了,要用一个无穷小量来做,实测1e-6过不了,我用1e-9可以。

巧妙之处在于x,y是整数,最大差值2000。所以斜率不存在用>2000就ok,虽然我用的1e7。/偷笑

另:为了后面的排序方便,我巧妙的把二维数组拉直,这也是一个不错的方法,在i,j随便换顺序都不影响的时候不失为一个不错的选择。

代码:
using namespace std;
#include <bits/stdc++.h>
#define int long long
double a[1005][2];
double b[1000005];
double inf=1e7,inf1=1e8,inf2=1e9;
signed main (void)
{
int n;cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i][0]>>a[i][1];
}
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (j!=i)
{
if (abs(a[i][1]-a[j][1])>1e-6)
b[in+j]=(a[i][0]-a[j][0])/(a[i][1]-a[j][1]);
else
if (a[i][0]==a[j][0])
b[i
n+j]=inf2;
else
b[in+j]=inf;
}
else
b[i
n+j]=inf1;
}
}
sort (b,b+nn);
int sum=0;
double mark=b[0]-1;
for (int i=0;i<n
n&&b[i]<1e8-1;i++)
{
//cout<<b[i]<<' ';
if (abs(mark-b[i])>1e-6)
{
mark=b[i];
sum++;
}
}
cout<<sum;
return 0;
}

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务