平面切分
问题描述
题解:
我对这种题极其非常不擅长。。。
另外吐槽为什么acwing的数据卡的这么死,蓝桥杯官网数据那么水
其实题目很简单,如果只有一个直线,那么就是两部分,如果是两个直线,这两个直线不相交(也就是平行),就是三部分,不想交就是四部分。。。然后枚举跟多的例子你会发现,平面的数量与直线的交点有关系,我们设一开始平面数为2(也就是一开始有一个直线),增加的平面数量为交点数+1,然后你每次加入新的直线,求之前直线的交点,然后用set存就可以了。但是注意注意!!有可能会出现重合或者平行的直线,对于平行的我们不管他,对于重合的,我们直接跳出当前循环,因为既然重合,说明之前那个直线都和其他的直线算过了,所以当前直线就不能再算了(否则会重复)
代码:
acwing最后一个点过不去
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1005;
double a[maxn],b[maxn];
set<pair<double ,double > >s;
set<pair<double ,double > >::iterator it;
bool f[maxn];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){double x,y;cin>>x>>y;s.insert(make_pair(x,y));}int tot=0;for(it=s.begin();it!=s.end();it++){a[tot]=(*it).first;b[tot]=(*it).second;tot++; }ll ans=2;for(int i=1;i<s.size();i++){set<pair<double ,double > >se;for(int j=i-1;j>=0;j--){if(abs(a[i]-a[j])<0.0001){if(abs(b[i]-b[j])<0.0001){f[i]=1;break;}else continue;} double x=(-1.0)*(b[i]-b[j])/(a[i]-a[j]);double y=x*a[i]+b[i];se.insert(make_pair(x,y));}if(f[i]!=1)ans+=(se.size()+1);}cout<<ans;
}