分形之城(算法竞赛进阶指南题目)个人理解与做法

原题链接: 98. 分形之城 - AcWing题库

首先是做这个题中获得的经验:

1.要求出2的次方,不需要预处理或者用pow函数,直接利用位运算即可

2.int的范围是最大2^31-1而不是2^32-1

3.学会了,要函数要返回两个值的时候,不必作为参数加&符号传过去,可以用结构体或者pair定义函数,就可以返回两个相连的变量

我个人的做法比较麻烦,先介绍一下我自己的做法:

例如对于等级3的城市:它可以分为四块,左上为0,右上为1,右下为2,左下为3,设向右为x轴,向下为y轴,第一个房子的坐标为(1,1)

找出第a个房子在等级3的坐标的步骤:

1.先求出a在四块中的哪一块,即为(a-1)/16,16为每一块区域中的房子个数(2^(n-1)),a-1的原因是为了处理边界情况,例如房子标号为16,16/16=1,但是实际上16标号在第0块区域.

2.求出该房子在该分块中的坐标:  例如该房子在第0块区域,以第2块区域为标准,第0块区域是由第2块区域顺时针旋转变化而来,第0块中的第一个房子对应第2块中标号为16的房子,第0块区域中第2块房子对应第二块区域中标号为15的房子..... 两者相加等于17(每个区块中房子数量+1).

以第0块中的第一个房子为例,它对应区块2中的第16个房子,由顺时针变换观察可知,第二块中的第16个房子的x坐标等于第0块中第一个房子的y坐标,第0块中第一个房子的x坐标+第二块中的第16个房子的y坐标=17,因此求第0块中第一个房子的坐标即为求第二块中的第16个房子的坐标

3.递归处理,递归到n==1,如果a=0 x=1 y=1 ,a=1 则x=2,y=1 ,a=2 则x=2,y=2 , a=3则 x=1,y=2;  

递归传回第0块中的第一个房子在第0块中的位置, 因为在第0块 则在等级3城市中的坐标即为在第0块的坐标,  若是在第1块,则在等级三城市的坐标即为在第1块的坐标的x+4,y  与此类似 可求出若在第二块或者第三块区域的坐标

本来打算写一下别人的思路,但是快写完了,又重新看了一下,发现我还并没有完全理解别人的思路,就不写了

代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;


pair<long long,long long> check(int n,long long a){
	if(n==1){
		if(a==1||a==4)return {1,(a+1)/2};
		else return {2,(a+1)/2};
	}

	long long t= 1ll<<(n-1)*2;
	long long tt=1ll<<(n-1);
	int z=(a-1)/t;
	a-=z*t;
	if(z==0){
		auto s=check(n-1,t+1-a);
		int x=s.first,y=s.second;
		return {tt+1-y,x};
	}else if(z==1){
		auto s=check(n-1,a);
		int x=s.first,y=s.second;
		return {x+tt,y};
	}else if(z==2){
		auto s=check(n-1,a);
		int x=s.first,y=s.second;
		return {x+tt,y+tt};
	}else if(z==3){
		auto s=check(n-1,t+1-a);
		int x=s.first,y=s.second;
		return {y,tt+1-x+tt};
	}
}

int main(){
	int n;
	cin>>n;
	while(n--){
		int N;
		long long A,B;
		cin>>N>>A>>B;
		auto ans=check(N,A);
		auto ans2=check(N,B);
		long long ax=ans.first,ay=ans.second,bx=ans2.first,by=ans2.second;
		double xx=ax-bx,yy=ay-by;
		printf("%.0lf\n",sqrt(xx*xx+yy*yy)*10);


	}
	return 0;
}

第一次写题解,自己都感觉自己讲的不好(汗)

相关推荐

  1. 算法竞赛指南学习目录

    2024-04-28 00:54:02       64 阅读
  2. 乘分解《算法竞赛指南

    2024-04-28 00:54:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-28 00:54:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-28 00:54:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-28 00:54:02       87 阅读
  4. Python语言-面向对象

    2024-04-28 00:54:02       96 阅读

热门阅读

  1. 5. HTTPS的特点

    2024-04-28 00:54:02       36 阅读
  2. LeetCode热题Hot100 - 最长有效括号

    2024-04-28 00:54:02       32 阅读
  3. 力扣经典150题第四十题:同构字符串

    2024-04-28 00:54:02       33 阅读
  4. 使用Spring和MyBatis构建流浪猫狗救助网站

    2024-04-28 00:54:02       38 阅读
  5. 力扣1518. 换水问题

    2024-04-28 00:54:02       36 阅读
  6. 【leetcode】对撞指针题目总结

    2024-04-28 00:54:02       33 阅读
  7. OpenCV如何使用分水岭算法进行图像分割

    2024-04-28 00:54:02       36 阅读
  8. 【贪心算法】Leetcode 55. 跳跃游戏【中等】

    2024-04-28 00:54:02       33 阅读
  9. 【运维】Gitlab备份

    2024-04-28 00:54:02       35 阅读
  10. 探究C++20协程(4)——协程中的调度器

    2024-04-28 00:54:02       25 阅读
  11. 清华大学 【战略管理的逻辑】全6讲笔记

    2024-04-28 00:54:02       24 阅读
  12. 【MySQL】数据库概述

    2024-04-28 00:54:02       32 阅读
  13. 【MySQL】基础知识

    2024-04-28 00:54:02       28 阅读
  14. k8s部署grafana

    2024-04-28 00:54:02       29 阅读
  15. Swift 中的条件语句:if 和 else

    2024-04-28 00:54:02       27 阅读