寒假每日一题——拖拉机
拖拉机
问题描述
干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。
他的奶牛非常调皮,决定对约翰来场恶作剧。
她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些干草捆。
拖拉机的位置以及 N 捆干草的位置都是二维平面上的整数坐标点。
拖拉机的初始位置上没有干草捆。
当约翰驾驶拖拉机时,他只能沿平行于坐标轴的方向(北,南,东和西)移动拖拉机,并且拖拉机必须每次移动整数距离。
例如,驾驶拖拉机先向北移动 2 单位长度,然后向东移动 3 单位长度。
拖拉机无法移动到干草捆占据的位置。
请帮助约翰确定他需要移除的干草捆的最小数量,以便他能够将拖拉机开到二维平面的原点。
输入格式
第一行包含三个整数:N 以及拖拉机的初始位置 (x,y)。
接下来 N 行,每行包含一个干草捆的位置坐标 (x,y)。
输出格式
输出约翰需要移除的干草捆的最小数量。
数据范围
1≤N≤50000,
1≤x,y≤1000
输入样例:
7 6 3
6 2
5 2
4 3
2 1
7 3
5 4
6 4
输出样例:
1
问题解决
1.证明双端队列广搜的队列中最多只有两段 一段为x 后一段为x+1
证明:
采用数学归纳法证明:
1.初始时,队列中只有起点,结论成立;
2.假设当k = n - 1时结论成立,证明当k = n时结论成立
3.因为当k = n - 1时成立,所以,x = x + 0放在队头, x = x + 1放在队尾,仍只有两段;若k = n - 1时只有一段,易证成立。故得证。
2.回归到题目
本题是点权问题,入队判重也可能对;若x,y在队列中,要到z的位置,而x到z是1,说明z是障碍物,那么y到z也是1
完整代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <deque>using namespace std;const int N = 1010;bool g[N][N], st[N][N];
int d[N][N];
int n, sx, sy;
typedef pair<int, int> PII;int bfs()//实际上是dijkstra算法
{deque<PII> dq;memset(d, 0x3f, sizeof d);dq.push_back({sx, sy});//将起点加入双端队列d[sx][sy] = 0;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};while(dq.size()){auto t = dq.front();dq.pop_front();int x = t.first, y = t.second;if(st[x][y]) continue;//表示该位置已经搜索过了st[x][y] = true;if(!x && !y)//即x y均等于0 表示拖拉机已开到原点break;for(int i = 0; i < 4; i++){int nx = x + dx[i], ny = y + dy[i];if(nx >= 0 && nx < N && ny >= 0 && ny < N){int w = 0;if(g[nx][ny]) w = 1;if(d[nx][ny] > d[x][y] + w){d[nx][ny] = d[x][y] + w;if(w == 0) dq.push_front({nx, ny}); //w等于0加到队头else dq.push_back({nx, ny});//w等于1加到队尾}}}}return d[0][0];
}int main()
{scanf("%d%d%d", &n, &sx, &sy);while (n -- ){int x, y;scanf("%d%d", &x, &y);g[x][y] = true;}printf("%d\n", bfs());return 0;
}
寒假每日一题——拖拉机相关推荐
- 2022.01.05 Acwing寒假每日一题 拖拉机
1.题目拖拉机 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一 ...
- 倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)
2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家看博客目录:https://b ...
- 【寒假每日一题】剪绳子(个人练习)详细题解+推导证明(第六天)
文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 今天终于出核酸检测的结果,还好大家都没事,不然怕是要封城了!!! 今天还是寒假 ...
- 【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸
文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 话说今天开始准备搞一个秋招的GitHub,算是复习一遍了. 今天还是寒假每日一 ...
- AcWing寒假每日一题2058. 笨拙的手指
AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...
- 倪文迪陪你学蓝桥杯2021寒假每日一题:1.20日(2018省赛A组第8题)
2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...
- 【寒假每日一题】数字三角形(个人练习)详细题解+推导证明(第二天)
文章目录 前言 题目 详细题解 写法1 O ( n 2 ) O(n^2) O(n2) 推导证明 写法2 O ( n 2 ) O(n^2) O(n2) 推导证明 举一反三 总结 前言 昨天真是人生中奇葩 ...
- 倪文迪陪你学蓝桥杯2021寒假每日一题:1.19日(2018省赛A组第7题)
2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...
- 倪文迪陪你学蓝桥杯2021寒假每日一题:2.1日(2019省赛A组第10题)
2021年寒假每日一题,2017~2019年的省赛真题.本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供.每日一题,关注蓝桥杯专栏: https://blog.csdn.net/w ...
最新文章
- mysql having子句_mysql having子句学习
- #pragma pack的作用
- 02 - Unit07:显示笔记下拉菜单、笔记的分享功能、笔记的删除功能
- Python Django 原生SQL查询(游标Cursor)
- centos安装python3.8
- 国内第四大运营商中国广电成立:5G 192号段要来了!
- mysql 重置表索引_MySQL管理表和索引
- java构造方法可以是私有的吗_Java中的构造函数可以私有吗?
- 智能家居规模发展尚需时日
- paip.svn使用小结
- JAVA锁和volatile的内存语义volatile的使用场景
- NotNorthwind-更新#1-您所有的Northwind都属于我们
- 传奇清理服务器信息,传奇行会信息等清除问题
- 判断系统(服务器)中是否存在后门程序的2个工具
- 【转载】20个2013年最值得关注的网页设计趋势
- Linux命令--tac(倒序查看文件所有内容)
- Python matplotlib绘图如何显示中文的问题【有报错没有解决】
- Linux环境下Shell脚本基础篇-鸡兔同笼问题
- 【世界数学难题】21世纪世界七大数学难题简介
- Web3中文|USDC的“脱锚”是稳定币稳定性的终结吗?