1411 - Ants(巨人与鬼)
紫薯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(巨人与鬼)的更多相关文章
- UVaLive4043 UVa1411 Ants 巨人与鬼
题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 法一:暴力 随机一个初始方案,枚举任意两条线段如果有交点就改一下. 效率其实挺好的. 法二:二分图最佳完美匹配 显然没有交点的 ...
- UVA 1411 - Ants(二分图完美匹配)
UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...
- UVa 1411 Ants(分治)
https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- uva 1411 Ants
题意: 一个平面上有n个黑色的点,n个白色的点,要求黑色的点与白色点之间一一配对,且线段之间不相交. 思路: 线段不相交并不好处理,想了很久想不出,所以看了蓝书的讲解. 一个很明显的结论是,不相交的线 ...
- 【uva 1411 Ants蚂蚁们】
题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...
- UVa 二分图匹配 Examples
这些都是刘汝佳的算法训练指南上的例题,基本包括了常见的几种二分图匹配的算法. 二分图是这样一个图,顶点分成两个不相交的集合X , Y中,其中同一个集合中没有边,所有的边关联在两个集合中. 给定一个二分 ...
- 【UVA 1411】 Ants (KM)
Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...
随机推荐
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- 学习Linux系统的态度及技巧
Linux作为一种简单快捷的操作系统,现在被广泛的应用.也适合越来越多的计算机爱好者学习和使用.但是对于Linux很多人可能认为很难,觉得它很神秘,从而对其避而远之,但事实真的是这样么?linux真的 ...
- Spring 使用介绍(十三)—— Bean的生命周期
一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ...
- JVM方法调用过程
JVM方法调用过程 重载和重写 同一个类中,如果出现多个名称相同,并且参数类型相同的方法,将无法通过编译.因此,想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同.这种方法上的联系就是重载 ...
- OpenCv的CV2一些函数总结
- 「POJ - 1003」Hangover
BUPT 2017 summer training (16) #2C 题意 n个卡片可以支撑住的长度是1/2+1/3+1/4+..+1/(n+1)个卡片长度.现在给出需要达到总长度,求最小的n. 题解 ...
- Nagios 使用 NSClient++ 监控Windows Server
在被监控的Windows server 主机上安装NSClinet++下载地址:https://www.nsclient.org/download/32bit:http://files.nsclien ...
- 【BZOJ1152】歌唱王国(生成函数,KMP)
[BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...
- 洛谷P3740 【[HAOI2014]贴海报】
(呃...本蒟蒻的第一篇题解qwq)..不废话了讲正题..思路来源于铺地毯(-->传送门)..先算出每一个格子上覆盖的海报并把可见的海报做标记然后算出有多少海报是可见的..但是作为省选题怎么可能 ...
- 实验八 应用层协议Ⅱ-FTP协议分析
实验八 应用层协议Ⅱ-FTP协议分析 一.实验目的 1.掌握FTP协议的实现原理. 2.了解控制通道和数据通道. 二.实验内容 用WareShark追踪ftp连接. 1.三次握手 2.ftp服务器回发 ...