样例">输入输出样例
示例
输入
3
1 1
2 2
3 3
输出
6
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
这题我们要知道一点平面几何的知识:在当前平面内加入一条直线后,新增加的平面个数等于该条直线被其余直线分割的段数,也就是交点+1,无论这个交点以前是否已经存在于其他两条直线。
然后考虑一些细节:
1.两条重复的直线等于是没有意义的,所以我们在输出端就把重复的去掉,可以用set来保证。
2.一条一条加直线到平面,我们计数的时候只要求出该直线和之前直线的交点,这些交点是不能重复的,再用一个set来保存就好了
代码如下所示:
#include <iostream>
#include <set>
using namespace std;
const int N=1001;
int n,ans=1;
typedef pair<long double,long double> PDD;
bool is2Line[1001];//记录某条直线是否与之前一样
int main()
{
// 请在此输入您的代码
scanf("%d",&n);
int a,b;
set<PDD> s;//筛重复边
long double A[N],B[N];
for(int i=0;i<n;++i)
{
scanf("%d%d",&a,&b);
s.insert({a,b});
}
int i=0;
for(auto it=s.begin();it!=s.end();++it,++i)
{
A[i]=it->first;
B[i]=it->second;
}
long long ans=2;
for(int i=1;i<s.size();++i)
{
set<PDD> point;//第i条直线和先前直线的交点
for(int j=i-1;j>=0;--j)
{
int a1=A[i],b1=B[i];
int a2=A[j],b2=B[j];
if(a1==a2)//平行无交点
continue;
point.insert({1.0*(b2-b1)/(a1-a2),1.0*a1*(((b2-b1)/(a1-a2)))});
}
ans+=point.size()+1;
}
printf("%d/n",ans);
return 0;
}