拖拉机

问题描述

干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。

他的奶牛非常调皮,决定对约翰来场恶作剧。

她们在田地的不同地方放了 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;
}

寒假每日一题——拖拉机相关推荐

  1. 2022.01.05 Acwing寒假每日一题 拖拉机

    1.题目拖拉机 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一 ...

  2. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家看博客目录:https://b ...

  3. 【寒假每日一题】剪绳子(个人练习)详细题解+推导证明(第六天)

    文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 今天终于出核酸检测的结果,还好大家都没事,不然怕是要封城了!!! 今天还是寒假 ...

  4. 【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸

    文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 话说今天开始准备搞一个秋招的GitHub,算是复习一遍了. 今天还是寒假每日一 ...

  5. AcWing寒假每日一题2058. 笨拙的手指

    AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...

  6. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.20日(2018省赛A组第8题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  7. 【寒假每日一题】数字三角形(个人练习)详细题解+推导证明(第二天)

    文章目录 前言 题目 详细题解 写法1 O ( n 2 ) O(n^2) O(n2) 推导证明 写法2 O ( n 2 ) O(n^2) O(n2) 推导证明 举一反三 总结 前言 昨天真是人生中奇葩 ...

  8. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.19日(2018省赛A组第7题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  9. 倪文迪陪你学蓝桥杯2021寒假每日一题:2.1日(2019省赛A组第10题)

    2021年寒假每日一题,2017~2019年的省赛真题.本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供.每日一题,关注蓝桥杯专栏: https://blog.csdn.net/w ...

最新文章

  1. mysql having子句_mysql having子句学习
  2. #pragma pack的作用
  3. 02 - Unit07:显示笔记下拉菜单、笔记的分享功能、笔记的删除功能
  4. Python Django 原生SQL查询(游标Cursor)
  5. centos安装python3.8
  6. 国内第四大运营商中国广电成立:5G 192号段要来了!
  7. mysql 重置表索引_MySQL管理表和索引
  8. java构造方法可以是私有的吗_Java中的构造函数可以私有吗?
  9. 智能家居规模发展尚需时日
  10. paip.svn使用小结
  11. JAVA锁和volatile的内存语义volatile的使用场景
  12. NotNorthwind-更新#1-您所有的Northwind都属于我们
  13. 传奇清理服务器信息,传奇行会信息等清除问题
  14. 判断系统(服务器)中是否存在后门程序的2个工具
  15. 【转载】20个2013年最值得关注的网页设计趋势
  16. Linux命令--tac(倒序查看文件所有内容)
  17. Python matplotlib绘图如何显示中文的问题【有报错没有解决】
  18. Linux环境下Shell脚本基础篇-鸡兔同笼问题
  19. 【世界数学难题】21世纪世界七大数学难题简介
  20. Web3中文|USDC的“脱锚”是稳定币稳定性的终结吗?

热门文章

  1. 史记翻译-汉初三杰-张良-留侯世家第二十五
  2. 学习笔记:强化学习与最优控制(Chapter 2)
  3. 数据分析之房价预测(机器学习,sklearn)
  4. 插入排序(直接插入排序,折半插入排序,希尔排序)
  5. Android开发一个美食app
  6. 餐饮店如何做活动吸引人
  7. 报表分析软件有哪些呢?不急不急,给你推荐几款好用的
  8. JNA释放Memory对象分配的内存
  9. 域 用户和计算机名,域环境中计算机名称解析
  10. 在鹅厂工作的广西表妹教我用Python生成会跳舞的美女~