问题描述】
平面上有 N 条直线,其中第 i 条直线是 y = Ai · x + Bi。
【输入格式】
第一行包含一个整数 N。
以下 N 行,每行包含两个整数 Ai; Bi。
【输出格式】
一个整数代表答案。
【样例输入】
3
1 1
2 2
3 3
1
2
3
4
【样例输出】
6
1
【评测用例规模与约定】
对于 50% 的评测用例, 1 ≤ N ≤ 4, −10 ≤ Ai; Bi ≤ 10。
对于所有评测用例, 1 ≤ N ≤ 1000, −100000 ≤ Ai; Bi ≤ 100000。
【答案提交】
请计算这些直线将平面分成了几个部分。
先去重,然后按照顺序每新增一个,新增的部分的个数=这一条线与前面的的线的交点个数+1,时间复杂度O(n^2long(n))
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
set<pair<long double,long double> > se;//交点
const int N = 1005;
long double A[N];
long double B[N];
set<pair<long double,long double> > s;//所有不重复的直线
set<pair<long double,long double> >::iterator it;
int main()
{
int n,i,j,x,y;
cin>>n;
for(i=0;i<n;i++)
{
cin>>x>>y;
s.insert(make_pair(x,y));//去掉重复的直线
}
n = s.size();
for(i=0,it=s.begin();it!=s.end();it++,i++)
{
A[i]=(*it).first;
B[i]=(*it).second;
}
long long ans=2;
set<pair<long double,long double> > se;
for(i=1;i<n;i++)
{
for(j=i-1;j>=0;j--)
{
//先判断是否平行,因为之前已经去重,所以直接判断斜率是否相等就行
if(A[i]==A[j])
continue;
long double x=(B[j]-B[i])/(A[i]-A[j]);
long double y=(A[j]*B[i]-A[i]*B[j])/(A[j]-A[i]);
se.insert(make_pair(x,y));
}
int n2=se.size();
ans+=(n2+1);
se.clear();
}
cout<<ans<<endl;
}
转载于这里