• hdu1030 Deltawave (数学题,找规律)


    纯数学题,找规律Orz

    看了网上的解题报告,稍微有点懂了

    首先就是找出m和n各自所在的层数,并求出俩层的差cc,这个好办

    接下来求出m(比较小的那个)所在三角往下的辐射边界,简单的说,就是m所在三角往左下角和右下角的延伸后,在n所在层的边界

    再来,就是判断n是在边界内还是边界外,若是边界外,则是n与边界距离+2*cc;

    若在边界内,则需判断n与m所在三角形是否同为正或同为倒,若同正同倒,则直接等于2*cc,若不同,则需判断m是正还是倒,若m为正,则为2*cc-1;若m为倒,则为2*cc+1;

    结合图片比较好理解http://acm.hdu.edu.cn/showproblem.php?pid=1030

    看代码吧,解释的比较清楚

    #include <stdio.h>
    #include<math.h>
    int main()
    {
    int temp,n,m,s,flag=3,cn,cm,zb,yb,cc,k,sj;
    while(scanf("%d%d",&m,&n)==2 )
    {   flag=3;s=0;k=0;
      if(m>n)   { temp=m;m=n; n=temp;}
      cn=(int)ceil(sqrt((double)n));//判断n和m所在层数
      cm=(int)ceil(sqrt((double)m));
          cc=abs(cn-cm);//判断两点层差
          zb=m+(cn-1)*(cn-1)-(cm-1)*(cm-1);//判断m辐射到n层所及范围的左边界和右边界
      yb=zb+2*cc;
    
          if(n>=zb && n <=yb) //判断n在m范围所须步数
          {s=2*(cc);k=1;}
          else
          {       if(n<zb) //判断n到m边界及m点所须步数和
                      s=2*(cc)+abs(n-zb); 
              else
              s=2*(cc)+abs(n-yb);
          }
      sj=m-(cm-1)*(cm-1);//判断三角类型0正,1倒
      if(abs(n-m)% 2 !=(cc) % 2)//不 同时为正三角或倒三角时,判断m所在为正三角还是倒三角
      {
          if(sj % 2 ==1 )//正三角
          flag=1;
          else
          flag=0;
      
      }
      if(flag==1 && k==1) s=s-1;//假如n点在m点辐射范围内,正三角-1,倒三角+1,不在不判断.
      if(flag==0 && k==1) s=s+1;
            printf("%d\n",s);
    }
    return 0;
    }
    
  • 相关阅读:
    HDU 6430 Problem E. TeaTree(虚树)
    hdu6437 Problem L.Videos(网络流)
    Rikka with Prefix Sum(组合数学)
    借教室
    2018年全国多校算法寒假训练营练习比赛(第五场)H Tree Recovery
    1296 营业额统计
    FZU oj Problem 2082 过路费
    大数乘法(适合k进制)
    重载小于号
    莫比乌斯
  • 原文地址:https://www.cnblogs.com/nanke/p/2120409.html
Copyright © 2020-2023  润新知