问题描述
平面上有 N条直线,其中第 i条直线是 y = Ai*x + B。
请计算这些直线将平面分成了几个部分。
输入格式
第一行包含一个整数N。
以下N行,每行包含两个整数 Ai, Bi。
3
1 1
2 2
3 3
输出格式
6
一个整数代表答案。
题解思路
根据欧拉定理有结论 每增加一条直线,对平面数增加的贡献值,是其与先前直线的交点数(不包括与已有交点重合的点)+1 这题两处用到了集合去重,一开始用集合加pair存储数据,然后将数据放到数组里对加入的每条直线与之前的之前的直线求交点并且去重,然后累加就是答案,感觉有更好的写法。
AC代码
#include <iostream>
#include <set>
#include <algorithm>
#include <cstdio>
using namespace std;
long double aa[1010];
long double bb[1010];
long long n;
set <pair <long double,long double> > s;
pair <long double,long double> p;
int main(){
long double a,b;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b;
p.first=a;
p.second=b;
s.insert(p);
}
int y = 0;
long long anss=2;
for(set <pair <long double,long double> > ::iterator it=s.begin();it!=s.end();it++,y++){
aa[y]=it -> first;
bb[y]=it -> second;
}
for(int k = 1;k < s.size(); k++)
{
set<pair<long double, long double> > pos;
for(int j = k-1;j >= 0; j--)
{
if(aa[k]==aa[j])
continue;
long double a1=aa[k],b1=bb[k];
long double a2=aa[j],b2=bb[j];
p.first = 1.0*(b2-b1)/(a1-a2);
p.second = 1.0*a1*((b2-b1)/(a1-a2)) + b1;
pos.insert(p);
}
anss+=pos.size() + 1;
}
printf("%lld\n",anss);
return 0;
}