题目描述

给出数字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. 02-35 scikit-learn库之支持向量机

    目录 scikit-learn库之支持向量机 一.SVC 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 二.LinearSVC 三.NuSVC 四.LinearSVR ...

  2. LeetCode_682-Baseball Game

    给定一个字符串列表,字符串包含整数,’+’,’D’,’C’,整数代表一个分数,’+’代表后两个有效分数的和,’D’代表后一个有效分数的两倍,’C’代表删除后一个有效的分数值,最后求所有有效分数的和.例 ...

  3. Mapper

    public static T MapTo<T>(this object obj) { if (obj == null) return default(T); Mapper.CreateM ...

  4. 【Java必修课】一图说尽排序,一文细说Sorting(Array、List、Stream的排序)

    简说排序 排序是极其常见的使用场景,因为在生活中就有很多这样的实例.国家GDP排名.奥运奖牌排名.明星粉丝排名等,各大排行榜,给人的既是动力,也是压力. 而讲到排序,就会有各种排序算法和相关实现,本文 ...

  5. Python flask 构建可扩展的restful apl☝☝☝

    Python flask 构建可扩展的restful apl☝☝☝ Flask-RESTful是flask的扩展,增加了对快速构建REST API的支持.Flask-RESTful通过最少的设置鼓励最 ...

  6. Bran的内核开发教程(bkerndev)-04 创建main函数和链接C文件

    目录 创建main函数和链接C文件 PS: 下面是我自己写的 Win10安装gcc编译器 本节教程对应的Linux下的编译脚本 _main的问题 创建main函数和链接C文件   一般C语言使用mai ...

  7. Windows 服务程序(一)

    Windows 服务程序简介: Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合. 它没有用户界面,并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件 ...

  8. [NOIp2014] luogu P1351 联合权值

    哎我博 4 了. 题目描述 无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边.点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi​,每条边的长度均为 111 ...

  9. Sieve of Eratosthenes时间复杂度的感性证明

    上代码. #include<cstdio> #include<cstdlib> #include<cstring> #define reg register con ...

  10. [Luogu3932] 浮游大陆的68号岛

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...