平面切分
平面切分
問題描述
題解:
我對這種題極其非常不擅長。。。
另外吐槽為什么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; }總結
- 上一篇: 哪款AD域管理软件更靠谱AD域管理软件
- 下一篇: 电吉他如何连接音响电吉他如何连接电脑音箱