题目描述
平面上有N 条直线,其中第i条直线是y = Ai x+Bi
请计算这些直线将平面分成了几个部分。
【输入格式】
输入的第一行包含一个整数N, 以下N行,包含两个证书 Ai,Bi
【输出格式】 一个整数代表答案
【样例输入】
31
1
2 2
3 3
【样例输出】
6
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#include<cstdio>
#include<map>
#include<set>
#include<cctype>
#define ll long long
#define ld long double
#define go(i,a,b) for(int i=a;i<=b;i++)//可用#include<bits/stdc++.h>,但最好手打;
using namespace std;
inline int read()//快读,也可以不用
{
register int x=0,f=1;
register char c=getchar();
while(!isdigit(c))
{
if(c=='-') f*=-1;
c=getchar();
}
while(isdigit(c))
{
x=x*10+c-48;
c=getchar();
}
return x*f;
}
const int maxn=1e3+10;
ld a[maxn][2];//开二维数组,记录斜率和y值
ll ans;
//int vis[maxn];//
int n;
pair<ld,ld>p;//更好记录A,B ->配合set去重,也可以开个vis数组判断
int main()
{
ios::sync_with_stdio(0);//去除c++的缓冲区
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i][0]>>a[i][1];
}
for(int i=0;i<n;i++)
{
// cin>>a[i][0]>>a[i][1];//法二,用vis打表
set<pair<ld,ld> >sp;
for(int j=0;j<i;j++)
{
// if(vis[j]) continue;
// if(a[i][0]==a[j][0])
// {
// if(a[i][1]==a[j][1])
// {
// vis[i]=1;
// break;
// }
// else continue;
// }
p.first=(a[j][1]-a[i][1])/(a[i][0]-a[j][0]);//(Y2-Y1)/(X1-X2) 高中大家都学过
//求x坐标 x(X1-X2)=(Y2-Y1) 这个好懂吧,求交点x坐标
p.second=p.first*a[i][0]+a[i][1];//带入原方程,求y
sp.insert(p);//插入,去重
}
ans+=sp.size()+1;//这里面都是相交的,自己与其他的交+1;
}
cout<<(ans+1)<<endl;
return 0;
}