hdu 1030 求最短路径
来源:互联网 发布:海岛奇兵升船数据 编辑:程序博客网 时间:2024/06/05 08:47
总体思路是: m,n 两个数,始终保证,m是两者中较小的一个,这样就只有一种情况了, 从m,到达n, 只有往下走,到达n所在的行,并且,尽可能地离n较近,最后,计算到达n所在行时,m所在的位置,
这道题的思路是这样的, 首先找到每行中每个数到达下一行的规律。
然后
1 、
发现 奇数行,只有奇数可以直接一步到下一行,偶数行,只有偶数才能直接到下一行,并且对应的数字为 当前m 加上2 *m所在行。
2、
然后对不能直接到达下一行的数,发现,只要在同行先向左还是向右走一步,就可以变换到 条件1,直接到下一行。
关键就是在情况2 时决定是向左走,还是向右走。
判断标准就是, 找到m竖直对应的n所在的行的数字,设为期待n
desireN, 如果比n大,那就向左走,靠近n,否则向右走,同样靠近n
#include <iostream> #include<cmath> using namespace std; int n,m; int level(int x){ int i=(int)sqrt(x); return i*i==x?i:i+1; } // calculate the vertical desired n for m in levle n int desire(int m,int i,int j){ int incr=(j-i)*(i+j-1); return m+incr; } int dist(int m,int n,int step){ if(m>n){ int t=m; m=n; n=t; } int lm=level(m); int ln=level(n); for(int i=lm;i<ln;i++){ if(i%2==0){ if(m%2==0){ m+=2*i; step++; }else{ // judge left or right if(n>desire(m,i,ln)){ m+=1; m+=2*i; step+=2; }else{ m-=1; m+=2*i; step+=2; } } }else{ // if(m%2==1){ m+=2*i; step++; }else{ // judge left or right if(n>desire(m,i,ln)){ m+=1; m+=2*i; step+=2; }else{ m-=1; m+=2*i; step+=2; } } } } step+=(n-m)>0?(n-m):(m-n); return step; } int main() { int result=0; while(cin>>m>>n){ cout<<dist(m,n,0)<<endl; } return 0;}
阅读全文
0 0
- hdu 1030 求最短路径
- hdu 1690 Bus System Floyd 求最短路径
- HDU 1874 求最短路径 Floyd 算法
- HDU 1874 求最短路径 Floyd 算法
- hdu 2544 dijkstra求最短路径模版题
- HDU:2112 HDU Today(floyd求最短路径+变形题)
- 【关键路径】hdu 4109
- HDU 1596 单源最短路径
- hdu 1506 路径压缩
- hdu 最短路径
- hdu 3790 双权值最短路径
- hdu 最短路径
- HDU 3790单源最短路径
- hdu 3790 单源最短路径
- HDU DP记录路径
- HDU:2066 一个人的旅行(dijkstra算法求最短路径)
- HDU:3665 Seaside(dijkstra算法求最短路径)
- HDU 1874 畅通工程续(Dijkstra算法求最短路径)
- Qt5 By CMake
- 序列化和反序列化的简单理解
- sharpen
- 微信小程序开发(6) SSL证书及HTTPS服务器
- LeetCode 53. Maximum Subarray
- hdu 1030 求最短路径
- Mysql对时间的统计
- spring AOP 静态代理和动态代理
- vue.js路由vue-router(二)——路由进阶
- C++Primer第四版习题16.12答案调试出错的解决
- DCMTK for android studio
- hadoop2.7.3分布式集群问题汇总(持续更新)
- Jetson TX1 安装tensorflow时交换空间和存储空间的准备
- poj 贪心相关之1328 Radar Installation