平面划分 蓝桥杯

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//每多一条直线,该直线对平面的贡献度为 该直线与已有直线的交点的个数+1
//累加所有直线对平面贡献度即为把平面分成了几部分

//1.set集合记录交点
//2.注意新加边为重边要跳过,之前边为重边只算一次交点
ll ans=0;
long double s[1010][2];
bool st[1010]; //标记是否重边
pair<long double, long double> p;

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> s[i][0] >> s[i][1]; 
		set<pair<long double, long double>> points;
		for (int j = 0; j < i; j++)
		{
			//求每条新加直线与已有直线的关系
			if (st[j]) continue;//之前的重边只算一次
			if (s[j][0] == s[i][0])//斜率相等
			{
				if (s[j][1] == s[i][1])//截距也相等,说明新加边为重边
				{
					st[i] = true;//标记重边
					break;
				}
				else//平行
				{
					continue;
				}
			}
			else//求交点并加入集合p
			{
				long double x = (s[j][1] - s[i][1]) / (s[i][0] - s[j][0]);
				long double y = s[i][0] * x + s[i][1];
				p.first = x;
				p.second = y;
				points.insert(p);
			}
		}
		if (!st[i]) ans += points.size() + 1;
	}
	cout << ans+1;
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值