SHOI2001 小狗散步
感觉这题最大的难点是发现它的解法是二分图最大匹配
主人的路线是固定的,对于每一段的路线,我们可以枚举小狗想去的景点,如果时间够,我们就将这段路线的起点和小狗想去的点连起来
这样就形成了一个二分图,因为dog每次与主人相遇之前最多只去一个景点,所以这道题就转化成了二分图最大匹配
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define LL long long
using namespace std;
LL read() {
LL k = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
k = k * 10 + c - 48, c = getchar();
return k * f;
}
double X1[110], Y1[110], X2[110], Y2[110];
double calc(double a, double b, double c, double d) {
return sqrt((c-a) * (c-a) + (d-b) * (d-b));
}
struct zzz {
int t, nex;
}e[10010 << 1]; int head[110], tot;
void add(int x, int y) {
e[++tot].t = y;
e[tot].nex = head[x];
head[x] = tot;
}
int lin[110], ans; bool vis[110];
bool find(int x) {
for(int i = head[x]; i; i = e[i].nex) {
if(!vis[e[i].t]) {
vis[e[i].t] = 1;
if(!lin[e[i].t] || find(lin[e[i].t])) return lin[e[i].t] = x, 1;
}
}
return 0;
}
int step[110];
int main() {
int n = read(), m = read();
for(int i = 1; i <= n; ++i) X1[i] = read(), Y1[i] = read();
for(int i = 1; i <= m; ++i) X2[i] = read(), Y2[i] = read();
for(int i = 1; i <= n-1; ++i) {
double x = calc(X1[i], Y1[i], X1[i+1], Y1[i+1]);
for(int j = 1; j <= m; ++j) {
if((calc(X1[i], Y1[i], X2[j], Y2[j]) + calc(X2[j], Y2[j], X1[i+1], Y1[i+1])) <= x * 2)
add(i, j);
}
}
for(int i = 1; i < n; ++i) {
memset(vis, 0, sizeof(vis));
ans += find(i);
}
printf("%d\n", ans+n);
for(int i = 1; i <= m; ++i) step[lin[i]] = i;
for(int i = 1; i <= n; ++i) {
printf("%.0lf %.0lf ", X1[i], Y1[i]);
if(step[i])
printf("%.0lf %.0lf ", X2[step[i]], Y2[step[i]]);
}
return 0;
}
SHOI2001 小狗散步的更多相关文章
- luoguP2526_[SHOI2001]小狗散步_二分图匹配
luoguP2526_[SHOI2001]小狗散步_二分图匹配 题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点 ...
- 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从(X1,Y1 ...
- [SHOI2001] 小狗散步 - 二分图匹配
考虑到每次与主人相遇之前最多只去一个景点,很容易转化为匹配问题 由于数据很小,我们不妨枚举每个相遇点间隙和每个景点,判断是否来得及,如果来得及就连边 沙雕题搞了二十来分钟,我是憨憨 #include ...
- [P2526][SHOI2001]小狗散步
Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...
- [luoguP2526] [SHOI2001]小狗散步(二分图最大匹配)
传送门 简直就是模板题啊! #include <cmath> #include <cstdio> #include <cstring> #include <i ...
- luogu2526 [SHOI2001]小狗散步
注意一个景点只能去一次. #include <iostream> #include <cstring> #include <cstdio> #include < ...
- 洛谷P2526 【SHOI2001】小狗散步
原题传送门 题目背景 Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇.小狗和主人同时从 ...
- 用画小狗的方法来解释Java中的值传递
在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? Dog myDog = new Dog("旺财"); changeName(myDog); System. ...
- HTML5 Canvas 奔跑的小狗
效果如上图,共六个图像切换,形成小狗动态奔跑效果.完整代码和图片请从 https://files.cnblogs.com/files/xiandedanteng/runningDog.rar 下载. ...
随机推荐
- OC 中的 weak 属性是怎么实现的?
OC 中的 weak 属性是怎么实现的,为什么在对象释放后会自动变成 nil?本文对这个问题进行了一点探讨.环境 mac OS Sierra 10.12.4 objc709参考答案 搜索后发现runt ...
- angular双向绑定与单向绑定的写法区别
[ngModel]="manualCode" (ngModelChange)="manualCode=$event;" 等价于下面这样的写法: [(ngMode ...
- ProtobufUtils
import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import com. ...
- Seven-segment Display 贪心选择,快速判断能否有解
https://csacademy.com/contest/round-39/task/seven-segment-display/ 可以知道,只有1是无解 而且肯定是选出来的位数约小越好. 位数 = ...
- 宋宝华:swappiness=0究竟意味着什么?
http://mp.weixin.qq.com/s/BixMISiPz3sR9FDNfVSJ6w 本文解释swappiness的作用,以及swappiness=0究竟意味着什么. 内存回收 我们都知道 ...
- Teradata 认证系列 - 2. Teradata数据库总览
Teradata (以下简称TD) 总览本课的学习目标 描述Teradata数据库产品的功能 知晓支持的操作系统 描述Teradata的并行架构 解释线性可扩展性 列出Teradata DBA永远不需 ...
- jquery初始
今天我们来学习Jquery的一些基本知识,jquery相对来说还是比较重要的,所以还是要好好学习的. 首先要了解什么是jQuery? l类似于python里面的模块,可以看成是一种库或者插件. 在学习 ...
- SID1190471 / 烦人的幻灯片 暴力出奇迹 !!!!!!!!!!!!!!!!!!
PID221 / 烦人的幻灯片 ☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态 查看最后一次评测记录 质量还不能统计出来哦~ 题目评价 质量 无 ★★★★★ ★★★★☆ ★ ...
- es6声明对象以及作用域与es5对比
es6声明变量: let x=1;//声明一个变量 const y=2;//声明一个只读常量,声明时必须赋值,之后值不可修改 es5声明变量: var z=3;//声明一个变量 区别: let不存在变 ...
- mui的ajax例子2
mui.post()方法 前端页面: <!DOCTYPE html><html><head> <meta charset="utf-8"& ...