题目描述

给出数字N(1≤N≤10000),X(1≤x≤1000),Y(1≤Y≤1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。 
在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下,你最少要走多少步才可以回到目标点。
注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d),那么它们的距离为|a-c|+|b-d|。 
注意:C++11里,不能定义变量名为Y1或者y1。 

输入

第1行:给出数字N,X,Y;
第2行:给出 x1,y1,x2,y2;
接下来N行:给出N个敌人所在的坐标. 
1≤N≤10000,1≤x≤1000,1≤Y≤1000.

输出

输出2个数:你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步.

样例输入 Copy

2 5 6
0 0 4 0
2 1
2 3

样例输出 Copy

2 14

考试总结:
  • 这题感觉还比较简单(相对于考试的其他题目来说),对于其他的什么折半搜索,dp,瞎搞,这题就属于只要你想写,码力还可以基本上都可以写出来
  • 这题的题目里明确说了要是最小值最大,所以这题很明显就是二分
  • 二分什么呢,看完题目就可以得知只能是离最近的敌人的距离。
  • 先预处理一下所有点到自己最近敌人的距离,然后去二分,再原来的图上跑暴力搜索,然后就没了,真的没了
  • 搞不懂为什么这题没人打呢,传说中的有分不要?
  • 放下代码
     #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int maxn=;
    const int mx[]={,-,,};
    const int my[]={,,,-};
    int n,m,dis[maxn][maxn],tim[maxn][maxn],vis[maxn][maxn];
    queue< int > q;
    void caltime() //预处理出所有点到最近敌人的距离
    {
    while(!q.empty())
    {
    int x=q.front()/m;
    int y=q.front()%m;
    q.pop();
    for(int dir=;dir<=;dir++)
    {
    int nx=x+mx[dir];
    int ny=y+my[dir];
    if(nx>=&&nx<n&&ny>=&&ny<m&&!vis[nx][ny])
    {
    vis[nx][ny]=;
    tim[nx][ny]=tim[x][y]+;
    q.push(nx*m+ny);
    }
    }
    }
    memset(vis,,sizeof(vis));
    }
    int check(int mid,int x1,int x2,int y1,int y2) //开始爆搜,怎么暴力怎么来
    {
    if(tim[x1][y1]<mid)
    {
    return ;
    }
    memset(vis,,sizeof(vis));
    q.push(x1*m+y1);
    vis[x1][y1]=;
    dis[x1][y1]=;
    while(!q.empty())
    {
    int x=q.front()/m;
    int y=q.front()%m;
    q.pop();
    for(int dir=;dir<=;dir++)
    {
    int nx=x+mx[dir];
    int ny=y+my[dir];
    if(nx>=&&nx<n&&ny>=&&ny<m&&!vis[nx][ny]&&tim[nx][ny]>=mid)
    {
    vis[nx][ny]=;
    dis[nx][ny]=dis[x][y]+;
    q.push(nx*m+ny);
    }
    }
    }
    return vis[x2][y2];
    }
    int main()
    {
    ios::sync_with_stdio(false);
    int c;
    cin>>c;
    cin>>n>>m;
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    for(int i=;i<=c;i++)
    {
    int x,y;
    cin>>x>>y;
    tim[x][y]=;
    vis[x][y]=;
    q.push(x*m+y);
    }
    caltime();
    int l=,r=max(n,m)+,mid;
    while(l+<r) //二分能当答案的距离
    {
    if(check(mid=l+r>>,x1,x2,y1,y2))
    {
    l=mid;
    }
    else
    {
    r=mid;
    }
    }
    check(l,x1,x2,y1,y2);
    cout<<l<<" "<<dis[x2][y2]<<endl;
    return ;
    }

总结一下:

  考试时要懂得放弃,不要死搞一题,,对于一些暴力可以过得东西要去打

NOIP 模拟赛 23 T4 大逃亡O(二分+广搜)(∩_∩)O的更多相关文章

  1. hdu 1253:胜利大逃亡(基础广搜BFS)

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. 【NOIP模拟赛】正方形大阵

    正方形大阵 [问题描述]   [输入格式]   第一行一个正整数n代表询问次数. 接下来n行每行一个不超过八位的小数k代表一组询问. [输出格式]   输出共n行,代表每次询问的答案:如果有无数个交点 ...

  3. noip模拟赛 第k大区间

    [问题描述] 定义一个长度为奇数的区间的值为其所包含的的元素的中位数. 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. [输入] 输入文件名为kth.in. 第一行两个数n和k ...

  4. noip模拟赛#23

    T1:n个元素的集合.要求取出k个子集,使得k个子集交集为空集.问有多少中取法. =>推了很久...想的是从k等于2的情况推到k等于3的情况....然后k=2推出来了k=3也推出来了...推了挺 ...

  5. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  8. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  9. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

随机推荐

  1. LitePal的修改和删除操作

    转载出处:http://blog.csdn.net/guolin_blog/article/details/40083685 传统的修改和删除数据方式   上篇文章中我们已经得知,SQLiteData ...

  2. 版本控制之Git小结

    一.版本控制 1.1 什么是版本控制 版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统.可以对任何类型的文件进行版本控制. 1.2 为什么需要版本控制 有了版本控制就可以 ...

  3. ubuntu使用uwsgi+nginx部署django

    ls -lha export WORKON_HOME=~/venv source /usr/local/bin/vitualenvwrapper.sh VIRTUALENVWRAPPER_PYTHON ...

  4. shell读取文件写入新文件

    #!/bin/sh #系统简称 SYST="HVPS" #发送行号 SEND1234SEND=" #接收行号 RECV1234RECV=" cd /home/w ...

  5. App自动化环境搭建

    1.安装Appium-desktop工具 下载地址:https://github.com/appium/appium-desktop/releases/tag/v1.8.2 2.安装Android环境 ...

  6. 关于CSS Grid Layout的代码解释

    .wrapper { display: grid; /*生成grid类型块级网格*/ grid-template-columns: repeat(3, 1fr); /*设置显示的列网格线,且重复3次1 ...

  7. Prometheus 源码解读(一)

    Prometheus 源码解读(一) Prometheus 是云原生监控领域的事实标准,越来越来的开源项目开始支持 Prometheus 监控数据格式.从本篇开始,我将和大家一起阅读分析 Promet ...

  8. java 线程池那点事儿

    1.为什么要用线程池 2.常见线程池以及参数 2.1 创建线程池 2.2 线程池参数 2.3 常见线程池 3.执行流程 4.健康检查 1.为什么要用线程池 线程池提供了一种任务的提交与任务的执行解偶的 ...

  9. 自然语言处理(NLP)

    苹果语音助手Siri的工作流程: 听 懂 思考 组织语言 回答 这其中每一步骤涉及的流程为: 语音识别 自然语言处理 - 语义分析 逻辑分析 - 结合业务场景与上下文 自然语言处理 - 分析结果生成自 ...

  10. linux系统状态网络、权限、用户大杂烩

    来来来,我们聊一下liunx系统相关的知识!! 首先从查询网络配置开始 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip命令是结合了ifc ...