2018年省赛热身赛第6场-G - Google Map(二分查询,地图找点)

题目链接

代码参考博客

*pi的的表示方法原来是acos(-1),第一次听同学这么告诉我,不过记住就行了。

*公式中的ln要换成log。

思路:

  题目很长,但其实很简单,同学给解释了一下,一下子就明白了。输入经度、纬度、查询次数,

1.通过给出的公式,把经度纬度转换成x,y,查询该点在地图上的位置(右上右下左上左下)并用给定的字符表示,注意看已给条件,第一次(level 0)位置不细分,第一个位置肯定是t,再对所在点当前的单元格细分,分成四块,再看点在哪里。

2.后面二分查询下就好了。

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
#define pi acos(-1.0)
int main(){
    double x,y;
    int level;
    while(cin >> x >> y >> level)
    {
        double top = log(tan(pi / 4 + (85 * pi / 180) / 2));
        double down = log(tan(pi / 4 + (-85 * pi / 180) / 2));
        double left = -180 * pi / 180;
        double right = 180 * pi / 180;
        string ans = "t";
        x = x * pi / 180;
        y = log(tan(pi / 4 + (y * pi / 180) / 2));
        while(level--)
        {
            double mid_x = (left + right) / 2;
            double mid_y = (top + down) / 2;

            if (x < mid_x && y < mid_y)//判断点在当前格子的那个部分
            {
                ans += "t";//string可以直接加的,char不行
                top = mid_y;
                right = mid_x;
            }
            else if (x < mid_x && y > mid_y)
            {
                ans += "q";
                down = mid_y;
                right = mid_x;
            } 
            else if (x > mid_x && y < mid_y)
            {
                ans += "s";
                top = mid_y;
                left = mid_x;
            }
            else if (x > mid_x && y > mid_y)
            {
                ans += "r";
                down = mid_y;
                left = mid_x;
            }
        }   
        cout << ans << endl;    
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/81876417