HDOJ HDU 1030 Delta-wave
来源:互联网 发布:windows.old删不掉 cmd 编辑:程序博客网 时间:2024/06/06 14:19
HDOJ HDU 1030 Delta-wave
题目
点击查看 HDOJ HDU 1030 Delta-wave
题意
给出图
按如图所示的方法对每个三角 进行标号
求 两标号三角形 的 距离 (穿过边的数量 )例如 6 12
经过6-7、7-13、13-12(其他的路最短的也为 3)
所以 为 3
题解
看到 有其他思路
这里就说说我的思路
- 我把 每个 1上1下三角形组成的四边形 看作一个单元格
- 把 右斜向一排元素 看作一行
- 把 左斜向一排元素 看作一列
- 把 横向一排元素 看作一层例如
1 3在一个单元
1 3 4 8 9 15 在第一行
1 3 2 6 5 11 在第一列
5 6 7 8 9 在第三层这样问题转化为 求 两单元格的距离(再细分每个元素 在单元格的 上 还是 下 即可) + 层数距离
例如
1 的坐标 (1,1) 第1层
14 在 (2,3) 第3 层
两单元格 要穿过 2 - 1 + 3 - 1 个
而 要穿过 3 - 1层
共穿过 5现在看 单元格坐标(r,c)的 求法
这里我的 思想是
先求 每行 行首元素 的 层数 t
设 d 是 元素 到层首元素的 距离 则
r = t -⌊(d+1)/2⌋ 1. (仔细观察)
c =⌊d/2⌋+1
接下解决 t 怎么求
我们注意到 第 n 层 末尾元素 都是 n^2
所以 我们只要 对元素开根 下取整 + 1即可 ( 注意 ! 每行最后元素应与该行元素计算一致所以 元素号 要 -1)
所以 a元素 的层数 t 为t=⌊(√a−1)⌋+1
d怎么求
设改层首元素的序号为 s 所以
所以 a元素 到 s 的 距离为 d - s
s怎么求
该行首元素 可以是 上层 末元素 + 1
所以 a元素 该层 的 首元素 s 为s=(⌊(√a−1)⌋)2+1 例如
求 7 和 16的距离
先求 7 的 层数 t =⌊(√7)⌋+1=3
再求 7 这层的 首元素 s =(⌊(√7−1)⌋)2+1=5
再求 d = 7 - 5 = 2
r = 3 -⌊(2+1)/2⌋ = 2
c =⌊2/2⌋+1 = 1
求得 7 的坐标 (2, 2) 层数 3
同理得 16 的坐标 (1, 4) 层数 4
穿过 abs(1-2) + abs(2-4) + abs(4-3) = 4
没找到 MathJax的绝对值 所以 用 abs代替了 知道的朋友回复我
代码
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta#include <iostream>#include <cmath>using namespace std;int main(){ int m,n,r1,c1,r2,c2,t1,t2,s,ans; bool g1,g2; while(cin >> m >> n) { ans = 0; if(m%2 == 0) g1 = true; else g1 =false; if(n%2 == 0) g2 = true; else g2 = false; if(m != 1) { t1 = sqrt(m-1); s = t1 * t1 + 1; t1++;// cout << t1 << endl; s = m - s; r1 = t1 - (s + 1)/2; c1 = 1 + s/2; } else{ t1 = r1 = c1 = 1; } if(n != 1) { t2 = sqrt(n-1); s = t2 * t2 + 1; t2++;// cout << t2 << endl; s = n - s; r2 = t2 - (s + 1)/2; c2 = 1 + s/2; }else{ t1 = r2 = c2 = 1; } ans = abs(r1-r2) + abs(c1-c2) + abs(t1-t2); cout << ans << endl; } return 0;}
⌊x⌋ 表示对 x 下取整 ↩
- HDOJ HDU 1030 Delta-wave
- HDOJ 1030 Delta-wave
- HDU 1030 Delta-wave
- HDU 1030 Delta-wave
- HDU 1030 Delta-wave
- HDU-1030-Delta-wave
- hdu 1030 Delta-wave
- hdu 1030 Delta-wave
- hdu 1030 Delta-Wave+
- HDU 1030 Delta-wave
- Hdu 1030 Delta Wave
- hdu 1030 Delta-wave
- Delta-wave(HDU 1030)
- hdu 1030 Delta-wave
- hdu 1030 Delta-wave
- HDU 1030 Delta-wave
- hdu 1030 Delta-wave
- 【HDU】 1030 Delta-wave
- 编译64位的boost库
- 菲波拉契数列兔子繁殖问题
- SecureCRT8.1安装破解教程
- 主键与唯一索引的区别
- 浏览器播放音频
- HDOJ HDU 1030 Delta-wave
- 表单提交的两种方式
- Spark静态内存管理:StaticMemoryManager
- 希尔排序
- Xlistview
- 安装Ubuntu16.04,安装sogoupiyin for linux
- 用数组中的元素拼接出最小的数
- java之jdbc(mysql)
- PAT (Basic Level) Practise (中文) 1042. 字符统计(20)