本文主要是介绍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;
}
孙少平上井以后,如果是白天,他总会迫不急待地走出矿区,走向如火如霞的山野之中。噢,他现在看起来不像个煤矿工人,倒像个多愁善感的诗人!
——《平凡的世界》
这篇关于AcWing 平面切分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!