在做这题的想到的是平行和相交以及重合的几种关系,两条线平行是会多出一个面,相交时会多出两个面,重合时不会增加面,第一次做的时候只考虑了每两条线之间的这些关系。 正确做法应该是考虑交点,写几个例子会发现是多出来的面正好是交点数+1
#include<iostream>
#include <set>
using namespace std;
int main(){
int n;
cin >> n;
pair<long double,long double> p;
set<pair<long double,long double>> st;
for(int i =1 ;i<=n;i++){
cin >> p.first >> p.second;
st.insert(p);
}
int k[n+1],b[n+1];
int len = 0;
for(set<pair<long double,long double>>::iterator it = st.begin();it!=st.end();it++){
k[++len] = it->first;
b[len] = it->second;
}
int ans = 2;
set<pair<long double,long double>> s;
pair<long double,long double> pp;
for(int i = 2;i<=len; i++){
s.clear();
for(int j = i-1;j>0;j--){
if(k[i] == k[j]) continue;
pp.first = 1.0*(b[i]-b[j]) / (k[j]-k[i]); //这里其实就是根据两条直线的方程求交点,自己列方程组化简一下
pp.second = k[i]*p.first + b[i];
s.insert(pp);
}
ans += s.size() + 1;
}
cout << ans << endl;
return 0;
}
|