2.4基本算法之分治 8463:Stupid cat & Doge
来源:互联网 发布:十一双十一淘宝 编辑:程序博客网 时间:2024/05/18 03:33
- 描述
动物园的规划和城市规划一样是个令人头疼的大问题。不幸的是,动物园规划师R.V.L.先生高估了小动物们的智商,他设计了一个极其复杂的动物园道路规划方案,如下图所示:
动物园按照下述方法进行扩建:当动物园规模扩大之后,R.V.L.先生设计的解决方案是把与原来动物园结构一样的区域复制或旋转90度之后按照图中的方式建设在原来的动物园周围(即将原来的动物园复制一遍放在原动物园上方,将顺时针旋转90度后的动物园放在原动物园的左上方,将逆时针旋转90度后的动物园放在原动物园的左方),再用道路将四部分的首尾连接起来,即可提升动物园的等级。
容易看出,等级提升后的动物园仍然是由一条道路连接,等级为N的动物园共能容纳2^2N只小动物,每只小动物将被分配到唯一的一间房屋。对于任意等级的动物园,我们从左上角开始沿着唯一的道路走,按照道路为房屋标号,就能够得到每间房屋的编号了。
说了这么多,智商余额不足的Stupid cat和Doge早已晕头转向。他们想知道,如果城市发展到了一定等级,他俩各自所处的房屋之间的直线距离是多少。房屋之间的距离是指两座房屋中心点之间的距离,你可以认为每间房屋都是边长为10米的正方形。
- 输入
- 输入包含多组测试数据,第一行有一个整数 T 表示测试数据的数目。
每组测试数据包含一行用空格隔开的三个整数 N, S, D,表示动物园等级,Stupid cat分配到的房屋编号和Doge分配到的房间编号。 - 输出
- 对于每组测试数据,在单独的一行内输出答案,四舍五入到整数。
- 样例输入
31 1 22 16 13 4 33
- 样例输出
103050
- 传送门
这道题是很具有代表性的分治题,作为本章节的最后一题,也是非常烧脑
我就说说我的思路,分析这个图,题目也有解释,于是就按照它的意思分成4快,先找到CAT和DOG的家在哪一个小块,再把这个小块分成更小的四块,直到边界,每次确定后就加上行列确定坐标,注意4小快在整个大块中位置不一样,于是有了第三行的一个二维数组,最后用勾股定理算出距离
其实解题思路就这样,主要实现很不容易,具体见以下代码和每一个细节的注释
#include<cstdio>#include<cmath>long long am[5][2]={{0,0},{0,0},{0,1},{1,1},{1,0}};//标号1:不变;2:加列数;3:加行数;4:一起加;long long n,a,b,N,x1,x2,y3,y2;void ml(long long l,long long x,long long &y,long long &z){long long ax=y,bx=z;if(l==1)//块数1:左上对角线翻折{y=bx;z=ax;}if(l==4)//块数4:右上对角线翻折{long long k=pow(2,x);//行列各加边长的一半y=bx;z=ax;y=k-y-1;//注意减一z=k-z-1;}}void mzls(long long l,long long x,long long &y,long long &z){if(l==0)return;long long k=pow(2,2*(l-1)),i;for(i=1;i<=4;i++)//判断块数(标号)1 2if(k*i>=x) //4 3break;mzls(l-1,x-(i-1)*k,y,z);//分成下一级ml(i,l-1,y,z);y+=pow(2,l-1)*am[i][0];//不同块数行列需改变z+=pow(2,l-1)*am[i][1];}int main(){scanf("%lld",&N);for(int i=1;i<=N;i++){scanf("%lld%lld%lld",&n,&a,&b);x1=x2=y3=y2=0;mzls(n,a,x1,x2);mzls(n,b,y3,y2);long long ans=round(sqrt(pow((x1-y3)*10,2)+pow((x2-y2)*10,2)));//数学公式计算printf("%lld\n",ans);}
- 2.4基本算法之分治 8463:Stupid cat & Doge
- 【分治】poj 8463 Stupid cat & Doge
- Openjudge 8463 Stupid cat & doge
- openjudge 8463:Stupid cat & Doge
- POJ(8463)-----Stupid cat & Doge(openjudge)
- NOI_OPENJUDGE_2.4_8463:Stupid cat & Doge题解
- 基本算法之分治法
- 基本算法-分治算法
- Openjudge NOI题库2.4基本算法之分治 7620:区间合并
- 算法之分治算法
- 分治算法之汉诺塔
- 算法之分治法
- 算法之分治思想
- 算法设计之分治
- 算法之分治法
- 算法系列之分治
- 常用算法之分治算法
- 分治算法之快速排序
- 通俗讲解KMP算法和next数组求解
- quartz定时任务
- chrome暂时无法在Fedora25/Wayland下运行的解决方法
- hibernate HQL多表查询
- 【IOI1994】The Clocks
- 2.4基本算法之分治 8463:Stupid cat & Doge
- MongoDB中的_id和ObjectId
- 重拾Java(2)-运算符
- bzoj1053 反素数 数论 + dp
- mysql交互(如何接收表单数据 Get方式,Post方式 (form表单))
- Linux系统下运行java程序(安装JDK环境)
- 提升方法
- Maximum Subarray
- [leetcode]581. Shortest Unsorted Continuous Subarray