蓝桥杯2020年第十一届省赛真题-I题-平面切分详细注释

原题链接

2873. 平面切分 - AcWing题库icon-default.png?t=M1L8https://www.acwing.com/problem/content/description/2876/代码

#include<iostream>
#include<set> //stl:set容器头文件引用  set不能添加已经存在的元素
using namespace std;
typedef pair<double, double> pdd;  //typedef可以将一种数据类型定义为自己习惯的名称。
set<pdd> line; //pair可以将两个数据合并成一个数据保存。这里将直线的斜率和截距作为一个数据保存,表示一条直线。
pdd iter; //存两直线焦点
int res = 1;
void compute(double x, double y)
{
	set<pdd> points;//焦点集
	for (auto l = line.begin(); l != line.end(); l++) //遍历已经存在的直线,计算它们和(x,y)直线的焦点
	{
		double a = l->first;
		double b = l->second;
		if (a != x)//不平行 则肯定相交
		{
			iter.first = (b - y) / (x - a);//计算焦点x
			iter.second = iter.first *x + y;//计算焦点y
			points.insert(iter);//存储焦点
		}
	}
	res += points.size();//有几条焦点,就加几
}
int main()
{
	int n; cin >> n;
	while (n--)
	{
		double k, b;
		cin >> k >> b;
		int m = line.size();
		line.insert(make_pair(k, b)); 
		if (m != line.size())//如果能够添加该直线,说明该直线未出现过
		{
			res++;//如果该直线不和任意直线相交,划分的平面只加1, 再与其他直线有k个交点,就再加k(通过compute函数来计算)
			compute(k, b);//计算该直线与已经存在的直线的交点个数
		}
	}
	cout << res << endl;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值