参考博客

紫薯P230

题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点。

紫薯思路:找出y坐标最小的点,如果多个,考虑x最小的。将其他点相对于这个点按极角从小到大排序,然后开始扫描,当白点和黑点一样多时(算上最下面的点),第一个和最后一个匹配,然后递归匹配中间的和外边这两部分

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int N = + ;
int n;
struct Point
{
int x, y;
Point() {}
Point(int x, int y) : x(x), y(y) {}
double angle(const Point& p) const // 求极角
{
return atan2(y - p.y, x - p.x);
}
bool operator< (const Point& p) const // 定义 <
{
return y < p.y || (y == p.y && x < p.x);
}
void read() // 读入坐标
{
scanf("%d%d", &x, &y);
}
};
struct Node
{
Point p; // 每一个点包含x,y坐标
int id;
double ang; // 与标准点的极角
bool operator< (const Node& node) const // 定义Node的<,按极角从小到大排序
{
return ang < node.ang;
}
void getAngle(const Node& node)
{
ang = p.angle(node.p);
}
int type() // 如果是黑点(白点) 返回1,否则返回-1,判断黑点和白点数量相等时使用
{
return id <= n ? : -;
}
}p[N * ];
int ans[N * ]; // 配对表
void solve(int l, int r)
{
if (l > r)
return;
int pos = l;
for (int i = l + ; i <= r; i++)
{
if (p[i].p < p[pos].p)
pos = i;
}
swap(p[l], p[pos]); // 让怕p[l]成为最下面的点,y最小
int cnt = p[l].type();
for (int i = l + ; i <= r; i++) // 求出所有点与标准的极角大小
{
p[i].getAngle(p[l]);
}
sort(p + l + , p + r + ); // 按极角从小到大排序
for (int i = l + ; i <= r; i++)
{
cnt += p[i].type();
if (!cnt) // 黑点和白点相等时 cnt == 0
{
ans[ p[i].id ] = p[l].id; // 此时的第一个 和 最后一个配对
ans[ p[l].id ] = p[i].id;
solve(l + , i - ); // 解决内部的
solve(i + , r); // 解决外部的
return;
}
}
}
int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= (n << ); i++)
{
p[i].p.read();
p[i].id = i;
}
solve(, n << );
for (int i = ; i <= n; i++)
{
printf("%d\n", ans[i] - n);
}
}
return ;
}

1411 - Ants(巨人与鬼)的更多相关文章

  1. UVaLive4043 UVa1411 Ants 巨人与鬼

    题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的 ...

  2. UVA 1411 - Ants(二分图完美匹配)

    UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...

  3. UVa 1411 Ants(分治)

    https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...

  4. uva 1411 Ants (权值和最小的完美匹配---KM算法)

    uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...

  5. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  6. uva 1411 Ants

    题意: 一个平面上有n个黑色的点,n个白色的点,要求黑色的点与白色点之间一一配对,且线段之间不相交. 思路: 线段不相交并不好处理,想了很久想不出,所以看了蓝书的讲解. 一个很明显的结论是,不相交的线 ...

  7. 【uva 1411 Ants蚂蚁们】

    题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...

  8. UVa 二分图匹配 Examples

    这些都是刘汝佳的算法训练指南上的例题,基本包括了常见的几种二分图匹配的算法. 二分图是这样一个图,顶点分成两个不相交的集合X , Y中,其中同一个集合中没有边,所有的边关联在两个集合中. 给定一个二分 ...

  9. 【UVA 1411】 Ants (KM)

    Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...

随机推荐

  1. CSS3 flexbox 布局 ---- flex项目属性介绍

    现在介绍用在flex项目上的css 属性,html结构还是用ul, li 结构,不过内容改成1,2,3, 样式的话,直接把给 ul 设display:flex 变成flex 容器,默认主轴的方向为水平 ...

  2. 实验吧 WEB 猫抓老鼠

    人生的第一道CTF题目哇,鸡冻 其实只是学了一下HTTP抓包得到的都是什么,就开始上手胡搞了 题目名字叫猫抓老鼠,还疯狂暗示catch!catch!catch!catch!,就想到要用抓包其实我是因为 ...

  3. 【C/C++】实现龙贝格算法

    1. 复化梯形法公式以及递推化 复化梯形法是一种有效改善求积公式精度的方法.将[a,b]区间n等分,步长h = (b-a)/n,分点xk = a + kh.复化求积公式就是将这n等分的每一个小区间进行 ...

  4. Fence Repair POJ - 3253 哈夫曼思想 优先队列

    题意:给出一段无限长的棍子,切一刀需要的代价是棍子的总长,例如21切一刀 变成什么长度 都是代价21 列如7切成5 和2 也是代价7题解:可以利用霍夫曼编码的思想 短的棍子就放在底层 长的尽量切少一次 ...

  5. Codeforces510 C. Fox And Names

    Codeforces题号:#510C 出处: Codeforces 主要算法:判环+拓扑 难度:4.2 思路分析: 要是把这道题联系到图上就很容易想了. 如何建图?由于最后要求名字满足字典序,所以不妨 ...

  6. [洛谷P2627] 修剪草坪

    传送门:>Here< 题意:不能有连续超过$k$个奶牛的一段,求最大的和 思路分析 Dp还是容易看出来的. 我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率.其实这也是可以解的,具 ...

  7. Matplotlib学习---用matplotlib画误差线(errorbar)

    误差线用于显示数据的不确定程度,误差一般使用标准差(Standard Deviation)或标准误差(Standard Error). 标准差(SD):是方差的算术平方根.如果是总体标准差,那么用σ表 ...

  8. NODE&NPM

    Awesome npm packages 更新版本: Mac/Linux:npm install -g n && n stable (默认安装目录为:usr/local/local/n ...

  9. nagios 配置 check_traffic 流量监控模块(被监控端)

    安装软件包yum -y install net-snmp*chkconfig nrpe onchkconfig snmpd on 使用SCP命令拷贝 check_traffic.sh 到 / usr/ ...

  10. 【题解】 bzoj3555: [Ctsc2014]企鹅QQ (字符串Hash)

    题面戳我 Solution 我们分析题意,他要求的是两个字符串只有一个字符不同,然后我们再看长度\(L \leq 200\),显然我们就可以把每一位删除后\(Hash\),然后判断相同个数即可 我一开 ...