• 18.06.27 15年期末Stupid cat & Doge


    描述

    动物园的规划和城市规划一样是个令人头疼的大问题。不幸的是,动物园规划师R.V.L.先生高估了小动物们的智商,他设计了一个极其复杂的动物园道路规划方案,如下图所示:

    动物园按照下述方法进行扩建:当动物园规模扩大之后,R.V.L.先生设计的解决方案是把与原来动物园结构一样的区域复制或旋转90度之后按照图中的方式建设在原来的动物园周围(即将原来的动物园复制一遍放在原动物园上方,将顺时针旋转90度后的动物园放在原动物园的左上方,将逆时针旋转90度后的动物园放在原动物园的左方),再用道路将四部分的首尾连接起来,即可提升动物园的等级。

    容易看出,等级提升后的动物园仍然是由一条道路连接,等级为N的动物园共能容纳2^2N只小动物,每只小动物将被分配到唯一的一间房屋。对于任意等级的动物园,我们从左上角开始沿着唯一的道路走,按照道路为房屋标号,就能够得到每间房屋的编号了。

    说了这么多,智商余额不足的Stupid cat和Doge早已晕头转向。他们想知道,如果城市发展到了一定等级,他俩各自所处的房屋之间的直线距离是多少。房屋之间的距离是指两座房屋中心点之间的距离,你可以认为每间房屋都是边长为10米的正方形。

    输入

    输入包含多组测试数据,第一行有一个整数 T 表示测试数据的数目。
    每组测试数据包含一行用空格隔开的三个整数 N, S, D,表示动物园等级,Stupid cat分配到的房屋编号和Doge分配到的房间编号。

    输出

    对于每组测试数据,在单独的一行内输出答案,四舍五入到整数。

    样例输入

    3
    1 1 2
    2 16 1
    3 4 33

    样例输出

    10
    30
    50

    提示

    【数据范围】
    N≤31,1≤S,D≤2^2N,1≤T≤10000.

     1 #include <cstdio>
     2 #include <string>
     3 #include <memory.h>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <math.h>
     7 #include <iostream>
     8 #include<queue>
     9 #include <vector>
    10 #include <bitset>
    11 using namespace std;
    12 
    13 long long int level;
    14 long long int h1, h2;
    15 
    16 int x[5] = {0, 1,1,2,2 };// id
    17 int y[5] = {0, 1,2,2,1 };
    18 
    19 long long int findy(long long int,long long int);
    20 
    21 long long int findx(long long int id,long long int level) {
    22     if (level == 1) 
    23         return x[id];
    24     long long int everypart = pow(4, level - 1);
    25     long long int part = (id-1) / everypart+1;
    26     long long int newid = id - (part - 1)*pow(4, level - 1);
    27     if (part == 1)
    28         return findy(id, level - 1);
    29     if (part == 2)
    30         return findx(id-everypart, level - 1);
    31     if (part == 3)
    32         return pow(2, level - 1) + findx(id - everypart * 2, level - 1);
    33     return pow(2, level) + 1 - findy(id - everypart * 3, level - 1);
    34 }
    35 long long int findy(long long int id, long long int level) {
    36     if (level == 1)
    37         return y[id];
    38     long long int everypart = pow(4, level - 1);
    39     long long int part = (id - 1) / everypart + 1;
    40     long long int newid = id - (part - 1)*pow(4, level - 1);
    41     if (part == 1)
    42         return findx(id, level - 1);
    43     if (part == 2)
    44         return findy(id - everypart, level - 1)+pow(2,level-1);
    45     if (part == 3)
    46         return pow(2, level - 1) + findy(id - everypart * 2, level - 1);
    47     return pow(2, level-1) - findx(id - everypart * 3, level - 1)+1;
    48 }
    49 
    50 int main()
    51 {
    52     int t;
    53     scanf("%d", &t);
    54     while (t--) {
    55         cin >> level >> h1 >> h2;
    56         long long int x1 = findx(h1, level), y1 = findy(h1, level);
    57         long long int x2 = findx(h2, level), y2 = findy(h2, level);
    58         long long int ans = round(sqrt(pow((x1 - x2),2) + pow((y1 - y2),2))*10);
    59         cout << ans << endl;
    60     }
    61     return 0;
    62 }
    View Code

    复制粘贴过去的时候没改导致了WA- -|||

    以及不用long long就会RE……

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    Asp.net Core 6.0 如何在开发时动态更新cshtml (开发篇)
    .NET Core 中正确使用 HttpClient 的姿势
    SQLite Entity Framework Core 使用 DBFirst
    c# 解析xml
    asp.net core 6 发布到IIS后打开开发模式(错误信息显示出来)
    linq to entity group by 时间
    Kubernetes——StatefulSet控制器——案例:etcd集群
    Kubernetes——访问控制
    C++正则表达式
    find、find_if、find_first_of、find_if_not、search、二分查找
  • 原文地址:https://www.cnblogs.com/yalphait/p/9235578.html
Copyright © 2020-2023  润新知