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. ...
随机推荐
- JdbcTemplate的运用 (也是数据源的一种)
- luogu3391
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- HackerRank beautiful string
问题 https://vjudge.net/problem/HackerRank-beautiful-string 给一个字符串S,可以任意取走S中的两个字符从而得到另外一个字符串P,求有多少种不同的 ...
- BZOJ3513[MUTC2013]idiots——FFT+生成函数
题目描述 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. 输入 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是n,接下来一行有n个 ...
- 51Nod 1381 硬币游戏
参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6445369.html 1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值 ...
- Joseph POJ - 1012 约瑟夫环递推
题意:约瑟夫环 初始前k个人后k个人 问m等于多少的时候 后k个先出去 题解:因为前k个位置是不动的,所以只要考虑每次递推后的位置在不在前面k个就行 有递推式 ans[i]=(ans[i-1]+m ...
- P1387 最大正方形 dp
思路: i j的最大正方形等于min(他的斜上方的的最大正方形,他的上方有的连续1,他的左方有的连续1)+1 #include<bits/stdc++.h> using namespac ...
- JavaWeb项目自动部署,持续集成
来公司以后,学会两种JavaWeb项目,自动部署. 1.jenkins持续集成.自动化部署 (1)安装jenkins----------推荐nginx跳转方式,以域名方式 (2)nginx采用不同域名 ...
- flask项目第一次如何运行创建数据库
- 【CodeForces706E】Working routine(二维链表)
BUPT2017 wintertraining(15) #6B 题意 q次操作,每次把两个给定子矩阵交换,求最后的矩阵.(2 ≤ n, m ≤ 1000, 1 ≤ q ≤ 10 000) 题解 用R[ ...