在做这题的想到的是平行和相交以及重合的几种关系,两条线平行是会多出一个面,相交时会多出两个面,重合时不会增加面,第一次做的时候只考虑了每两条线之间的这些关系。
正确做法应该是考虑交点,写几个例子会发现是多出来的面正好是交点数+1
#include#include using namespace std; int main(){ int n; cin >> n; pair p; set > 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 >::iterator it = st.begin();it!=st.end();it++){ k[++len] = it->first; b[len] = it->second; } int ans = 2; set > s; pair 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; }



