AcWing 平面切分

 

1、思路怎么想?

(1)定义:

1)所有数据包括斜率和截距,用pair存储,

2)所有直线都是不重合的,所以用set存储,pair类型的set容器,

3)用一个pair去表示一个焦点,第一个参量是横坐标x,第二个参量是纵坐标y,

(2)原理:

初始化res 为 1 ,

在每条直线进来之后,先res++

再加上,新进来的直线,与已经存在的直线的焦点数,即为答案,

(3)注意:

输入的线条可能为重合线条,所以需要判重,

这里很巧妙,因为set容器不能插入重复的线,所以只需记住上一条线数量,再与新插入进来的线的数量,作比较,

2、代码怎么写?

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>

using namespace std;

typedef pair<double , double>Pdd; 
set<Pdd> line;//存储直线斜率和截距的set容器
Pdd iter;//表示两直线焦点 
int res = 1;

void compute(double x ,double y)
{
	set<Pdd> points;//存储焦点
	//遍历所有已经输入的边
	for(set<Pdd>::iterator l = line.begin() ; l != line.end() ; l++)
	{
		double a = l->first;
		double b = l->second;
		if(a != x)//相交必有焦点,焦点可重合,用set来存去重 
		{
			iter.first = (b - y) / (x - a);
			iter.second = iter.first * x - y;
			points.insert(iter);
		}	
	} 
	res += points.size();
}

int main()
{
	int n;
	scanf("%d", &n);
	while(n--)
	{
		double k , b;
		scanf("%lf%lf", &k , &b);
		int m = line.size();
		line.insert(make_pair(k,b));//make_pair()可直接将k,b转化为一个pair 
		if(m != line.size())
		{
			res++;
			compute(k , b);
		}
	}
	printf("%d" , res);
	return 0;
}
 

孙少平上井以后,如果是白天,他总会迫不急待地走出矿区,走向如火如霞的山野之中。噢,他现在看起来不像个煤矿工人,倒像个多愁善感的诗人!

                                                                ——《平凡的世界》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值