赞
踩
问题描述
平面上有 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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。