題目描述
平面上有 N 條直線说铃,其中第 i 條直線是 y = Ai x + Bi 柔滔。
請(qǐng)計(jì)算這些直線將平面分成了幾個(gè)部分佑惠。
輸入描述
第一行包含一個(gè)整數(shù) N朋腋。
以下 N 行,每行包含兩個(gè)整數(shù) Ai, Bi膜楷。
其中旭咽,1≤N≤1000,?10^5 ≤ Ai,Bi ≤ 1^05。
輸出描述
一個(gè)整數(shù)代表答案赌厅。
輸入輸出樣例
示例
輸入:
3
1 1
2 2
3 3
輸出:
6
思路:
當(dāng)加入一條新直線的時(shí)候穷绵,平面新增的部分?jǐn)?shù)為這條直線和前面的直線的交點(diǎn)數(shù)+1。
要注意的是特愿,set只能用迭代器訪問仲墨,一般我們要用set中的數(shù)據(jù)的時(shí)候,都會(huì)把這些數(shù)據(jù)存到其他數(shù)據(jù)結(jié)構(gòu)中洽议。
還有就是宗收,pair在比賽中比較方便,兩元的情況還是比較多的亚兄。
AC:
#include <stdio.h>
#include <set>
#include <vector>
using namespace std;
const int N = 2000;
set<pair<double, double> > line;
double A[N], B[N];
int n;
long long sum = 2;
int main() {
scanf("%d", &n);
for(int i = 0; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
line.insert(make_pair(a, b));
}
n = line.size();
int index = 0;
for(set<pair<double, double> >::iterator it = line.begin(); it != line.end(); it++)
{
A[index] = (*it).first;
B[index] = (*it).second;
index ++;
}
for(int i = 1; i < n; i++) {
set<pair<double, double> > d;
for(int j = i - 1; j >= 0; j--) {
if(A[i] != A[j]) {
double x = (B[i]-B[j]) / (A[j] - A[i]);
double y = (B[i]*A[j] - A[i]*B[j]) / (A[j] - A[i]);
d.insert(make_pair(x, y));
}
}
sum += d.size() + 1;
}
printf("%lld", sum);
return 0;
}