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));
            } 
        }
    }
  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/lipu123/p/14059081.html
Copyright © 2011-2022 走看看