蓝桥杯 平面切分(欧拉定理)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                蓝桥杯 平面切分(欧拉定理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                問題描述
 平面上有 N條直線,其中第 i條直線是 y = Ai*x + B。
請計算這些直線將平面分成了幾個部分。
輸入格式
 第一行包含一個整數N。
以下N行,每行包含兩個整數 Ai, Bi。
輸出格式
 一個整數代表答案。
樣例輸入
3 1 1 2 2 3 3樣例輸出
6基本思路
 首先通過set容器對輸入的數據進行去重,根據“每增加一條直線,對平面數增加的貢獻值,是其與先前直線的交點數(不包括與已有交點重合的點)+1 ”的結論進行累加,最后輸出結果即可(具體步驟見代碼注釋~)。
AC代碼
#include<bits/stdc++.h> using namespace std; const int N = 1005;int main() {int n;scanf("%d", &n);int a, b;long double A[N], B[N];pair<long double, long double> p; set<pair<long double, long double> > s; //利用set自動去重功能篩選掉重邊 for(int i = 0; i < n; i++){scanf("%d %d", &a, &b);p.first = a;p.second = b;s.insert(p);}int i = 0; //將去重后的直線數據放回A,B數組 for(set<pair<long double, long double> >::iterator it = s.begin(); it != s.end(); it++, i++){A[i] = it -> first;B[i] = it -> second;}long long ans = 2; //初始情況當只有一條直線時,有兩個平面 for(int i = 1; i < s.size(); i++) //從下標1開始,也就是第二條直線 {set<pair<long double, long double> > pos; //記錄第i條直線與先前的交點 for(int j = i-1; j >= 0; j--){int a1 = A[i], b1 = B[i];int a2 = A[j], b2 = B[j];if(a1 == a2) //遇到平行線無交點,跳出 continue; p.first = 1.0*(b2-b1)/(a1-a2);p.second = 1.0*a1*((b2-b1)/(a1-a2)) + b1;pos.insert(p); }ans += pos.size() + 1; //根據結論,每增加一條直線,對平面數的貢獻值是其與先前直線的交點數(不重合)+1 } printf("%d\n", ans);return 0; }總結
以上是生活随笔為你收集整理的蓝桥杯 平面切分(欧拉定理)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 眉毛中间有痣代表什么
- 下一篇: 验孕棒第二条似有若无说明什么
