zoukankan      html  css  js  c++  java
  • 二分迷宫

    链接:https://ac.nowcoder.com/acm/contest/9165/E
    来源:牛客网

    牛郎织女生活在一个巨大的二维坐标系之中,他们的位置永远是一个二维坐标整数对(x,y),其中x,y均为整数(可能为负),在x轴上阻隔了坐标轴上半部分和下半部分的连通,即存在y=0的直线阻隔上下部分的连通。
    而在x轴上,聪明的丘比特为牛郎和织女挖出了n个洞,洞的坐标为 (a1, 0),(a2, 0), ……, (aN, 0) ,其中a为整数。
    牛郎每次移动只能移动到相邻的格子,设牛郎当前位置为(a,b),则他可以到达(a+1,b),(a-1,b),(a,b+1),(a,b-1) 这四个格子(但不能穿过直线,除非有洞)
    即对于y = 0上的所有格子,只有 (a1, 0),(a2, 0), ……, (aN, 0) 可以通过,之外的所有纵坐标为0的网格均不能通过,而对于(x, y)有y不为0的网格可以认为是随意通过的。
    下面有m个询问,询问牛郎的初始坐标为(x1,y1),织女的初始坐标为(x2,y2)时,牛郎需要移动多少次找到织女(坐标与织女重合)

    输入描述:

    输入的第1行为一个正整数N,为直线上洞的个数。

    第2行有N个整数,a1, a2,…, aN,之间用空格隔开,为这N个洞的横坐标。

    第3行为一个正整数M,表示了M个询问。

    接下来M行,每行4个整数x1, y1, x2, y2,有y1与y2均不等于0,表示了一个询问从(x1, y1)到(x2, y2)的最短路。

    输出描述:

    输出共包含m行,第i行对于第i个询问输出从(x1, y1)到(x2, y2)的最短路距离是多少。

    示例1

    输入

    复制
    2
    2 -1
    2
    0 1 0 -1
    1 1 2 2

    输出

    复制
    4
    2

    说明

    n,m≤100000,ai,xi,yi绝对值不超过100000000。

    这个题大意了,一直在想BFS,其实就是一个二分

    #include<iostream>
    #include<algorithm>
    #include<map>
    #include<queue> 
    using namespace std;
    typedef long long ll;
    const int maxn=1e5+100;
    int a[maxn];
    int main(){
        int n,t;
        cin>>n;
        a[1]=-1e9;
        for(int i=2;i<=n+1;i++){
            cin>>a[i];
        }
        a[n+2]=1e9;
        n+=2;
        sort(a+1,a+n+1);
        cin>>t; 
        while(t--){
            int x,y,xx,yy;
            scanf("%d%d%d%d",&x,&y,&xx,&yy);
            if(y>=0&&yy>=0){
                printf("%d
    ",abs(x-xx)+abs(y-yy));
            }
            else if(y<=0&&yy<=0){
                printf("%d
    ",abs(x-xx)+abs(y-yy));
            }
            else{
                if(x>xx) {
                    swap(x,xx);
                    swap(y,yy);
                }
                int u=lower_bound(a+1,a+n+1,x)-a;
                int ans=0,p=0;
                ans+=a[u]-x;
                if(xx>=a[u]){
                    ans+=(xx-a[u]);
                } 
                else{
                    ans+=(a[u]-xx);
                }
                p+=(x-a[u-1]);
                p+=(xx-a[u-1]); 
                printf("%d
    ",min(ans,p)+abs(y-yy));
            } 
        }
    }
  • 相关阅读:
    程序员修炼之道读书笔记02
    程序员修炼之道读书笔记01
    2021年1月30日 体温上报app03(百度API的获取和配置方法)
    2021年1月28日 体温上报app02
    2021年1月27日 体温上报app01
    2021年1月26日 sqlite数据库
    2021年1月25日 列表与适配器
    16.CSS margin用法
    14.CSS 块级元素与行内元素
    12.CSS 简单认识margin
  • 原文地址:https://www.cnblogs.com/lipu123/p/14059081.html
Copyright © 2011-2022 走看看