[蓝桥杯2020初赛] 平面切分

  1. 在平面上添加一条线L(此线不与已有的线重合),线L与已有的线产生M给交点
  2. 新增平面数目=M+1
  3. 所以我们这道题:要判断每添加一条线,新增的交点数目;要判断添加一条线是否与以有的线重合
  4. 没有添加直线时,本来就有一个平面
#include"bits/stdc++.h"
using namespace std;

set<pair<double,double> >line;//用set存储直线
long long ans=1;//一共有多少平面数 

int component(double a1,double b1){//判断交点数目 

	set<pair<double,double> >point;//用set集合判断点,**注意set对点有去重功能额 
	for(set<pair<double,double> >::iterator i=line.begin();i!=line.end();i++){
		double a=(*i).first,b=(*i).second;
		if(a==a1)continue;
		else{
			double x = (b1-b)/(a-a1);
			double y = a1*x+b1;
			pair<double,double> po(x,y);
			point.insert(po);
		}
	}
	
	return point.size();
}


int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int L=line.size();//用于下面判断 
		double a,b;
		cin>>a>>b;
		pair<double,double> m(a,b);
		line.insert(m);
		if(L!=line.size()){//如果添加了这条直线,这条直线与之前重合,set会自动去重,line长度不变 
			ans++;
			ans+=component(a,b);
		}
		
	}
	cout<<ans;

} 

注意:

  1. set有去重功能
  2. 如果不用set,直接的对double进行判断是否相同,那么要注意double判断相等不能直接用if(a==b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值