zoukankan      html  css  js  c++  java
  • HDU 1030(三角数阵 数学)

    题意是问在给定的三角形数阵中从一个数到另一个数所要跨过的边数。

    最初的时候很迷,除了发现每层的数字个数与层数间的关系和每层数最后一个数与层数的关系外什么也没看出来,打算先求出数字所在的层数,然后计算到该层最后一个数要跨过的边数,由于各层最后一个数之间所跨过的边数与层数差有关(称层数距离),

    因此可以求得一条路线:如图

      

    但两数间的最短路线依然求不到,感觉也不能用到每层最后一个数所跨边数作差,而层数距离也不一定会体现在最短路径中,比如 7 和 13 这一组,就只跨一条边即可。

    借鉴了别人的博客,才知道了原图是要拆开看的:

                 

    用这种方式分别分层之后,再去计算在每张图中跨过了多少层,然后对每张图中的层数差的绝对值求和即为结果。

    另外,这道题很坑的一点是没说清楚输入有多少组,一直以为是只有一组,然后一直 wa...... 还是每次都让其输入到文件末靠谱一点。

    代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int getp(int n)
     4 {
     5 //    int i = 1;
     6 //    while(i * i < n) ++i;
     7 //    return i;
     8     return (int)ceil(sqrt(n));
     9 }
    10 int main()
    11 {
    12     int m,n,pm,pn,pm1,pm2,pn1,pn2,ans;
    13     while(~scanf("%d%d",&m,&n))
    14     {
    15         pm = getp(m);
    16         pn = getp(n);
    17         pm1 = ((m-(pm-1)*(pm-1)-1)>>1)+1;
    18         pn1 = ((n-(pn-1)*(pn-1)-1)>>1)+1;
    19         pm2 = ((pm*pm-m)>>1)+1;
    20         pn2 = ((pn*pn-n)>>1)+1;
    21         ans = abs(pm-pn) + abs(pm1-pn1) + abs(pm2-pn2);
    22         printf("%d
    ",ans);
    23     }
    24     return 0;
    25 }
    View Code
    日后若能有更好的想法,再来完善。 希望看到的大神不吝赐教 orz
  • 相关阅读:
    TestNG 入门教程
    Angularjs中文版本开发指南发布
    你是码农 还是优秀程序员?
    java牛人给新人的几点建议
    有一种毒药叫励志书
    牛人眼中如何精通spring?
    驯服你的Windows Server 2003
    windows 7 里面的iis在哪里
    神器 cmder
    亚信UED前端流程自动化构建工具
  • 原文地址:https://www.cnblogs.com/Taskr212/p/9535709.html
Copyright © 2011-2022 走看看